Другая схема блокировки шрифта для "специальных" комментариев в производном режиме emacs

Я определяю основной режим Emacs, основываясь на prog-mode. Блокировка шрифтов работает за исключением одного:

Я хотел бы выделить специальный тип комментария, который содержит специальные директивы компоновщика, используя шрифт, отличный от того, который используется для обычных комментариев. Регулярные комментарии начинаются с ";" тогда как директивы компоновщика имеют форму ";<... 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?

1 ответ

Решение

Вы хотите использовать 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)
  ...
Другие вопросы по тегам