Другая схема блокировки шрифта для "специальных" комментариев в производном режиме 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)
...