1

prog-mode から派生させて Emacs メジャー モードを定義しています。フォントロックは、次の 1 つの点を除いて機能します。

通常のコメントに使用されるフォントとは異なるフォントを使用して、特別なリンカー ディレクティブを含む特別なコメント タイプを強調したいと思います。通常のコメントは「;」で始まります 一方、リンカー ディレクティブの形式は ";<...directive...>" です。もちろん、文字列内のテキストをコメントと誤認してはなりません。

私がこれまでに持っているものは次のとおりです。

;; define syntax highlighting
(setq p18-font-lock-defaults
      `(
        ;; strings
        ("\"\\.\\*\\?" . font-lock-string-face)
        ;; linker directives
        ("^ *;<.+>.*$" . font-lock-preprocessor-face)
        ;; mnemonics
        ( , p18-mnemonics-regexp . font-lock-keyword-face)
        )
  )

;; define derived mode
(define-derived-mode p18-mode prog-mode "P18"
  "...mode description..."

  ;; define syntax highlighting
  (set (make-local-variable 'font-lock-defaults)
      '(p18-font-lock-defaults nil t))

  ;; comments
  (setq comment-start ";")
  (setq comment-end "")

  ;; === works when comments start with "; "
  ;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table) 
  ;; (modify-syntax-entry 32 ". 2" p18-mode-syntax-table) 
  ;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)

  ;; ugly incomplete hack works for comments with ASCII code of
  ;; second char ?\;
  ;; (modify-syntax-entry ?; ". 1" p18-mode-syntax-table) 
  ;; (modify-syntax-entry '(?= . 127) ". 2" p18-mode-syntax-table) 
  ;; (modify-syntax-entry ?\n ">" p18-mode-syntax-table)

  )

問題は、構文テーブル エントリを使用すると、このメカニズムが ; で始まるすべてのものを分類することです。コメントとして。したがって、リンカ ディレクティブ regexp はもはや有効ではありません。

どうすれば望ましい動作を実現できますか? 後続の文字をチェックできるパターンが必要なようです。しかし、コメント検出に構文テーブルを使用することは、文字列を正しく処理するので良いように思えます。

より一般的には、emacs/elisp の「アーキテクチャ」を説明するドキュメントに興味があります (たとえば、モードと、フォントロックで機能する操作のシーケンス。バッファの相互作用についても同様です)。私は素晴らしい elisp リファレンス マニュアルを持っていますが、これらのトピックの概念的な紹介を見逃しています。私は emacs elisp イントロを読みましたが、あまりにも「チュートリアルスタイル」で、非常に長く、反復的で、体系的なカバレッジが欠けているため、好きではありませんでした。たとえば、バッククォートに関する文はありませんでした。また、プログラミングの経験がまったくない人にも対応しているように見えましたが、それでは elisp から始めますか?

4

1 に答える 1

2

font-lock-syntactic-face-functionどの種類のコメントがどの顔になるかを区別するために使用します。たとえば、次のようなもの

(defun my-font-lock-syntactic-face-function (ppss)
  (if (and (nth 8 ppss)
           (save-excursion
             (goto-char (nth 8 ppss))
             (looking-at ";<.+>")))
      'font-lock-preprocessor-face
    (funcall (default-value 'font-lock-syntactic-face-function) ppss)))
...
(define-derived-mode ...
  ...
  (set (make-local-variable 'font-lock-syntactic-face-function)
       #'my-font-lock-syntactic-face-function)
  ...
于 2016-03-14T12:47:45.537 に答える