1

У меня есть следующее определение макроса M4:

define(`printlist',`$1`'ifelse(`$#',1,,`printlist(shift($@))')')

# действительно начинает комментарий в синтаксисе M4, но только если ему не предшествует $: $# - это число аргументов, которые получил макрос.

Как я могу изменить m4-font-lock-keywords чтобы справиться с этим соответствующим образом?

Значение по умолчанию:

(("\\(\\b\\(m4_\\)?dnl\\b\\|^\\#\\).*$" . font-lock-comment-face)
 ("\\$[*#@0-9]" . font-lock-variable-name-face)
 ("\\$\\@" . font-lock-variable-name-face)
 ("\\$\\*" . font-lock-variable-name-face)
 ("\\b\\(...\\)\\b" . font-lock-keyword-face))

1 ответ1

0

На самом деле, # также может начинать комментарий, когда ему предшествует $ . Начинает ли комментарий # или нет, зависит от того, находится ли он в цитируемом тексте или нет.

Вы можете попробовать код ниже, чтобы Emacs (попытался) более точно следовать семантике m4:

(defun m4--quoted-p (pos)
  "Return non-nil if POS is inside a quoted string."
  (let ((quoted nil))
    (dolist (o (nth 9 (save-excursion (syntax-ppss pos))))
      (if (eq (char-after o) ?\`) (setq quoted t)))
    quoted))

(defconst m4-syntax-propertize
  (syntax-propertize-rules
   ("#" (0 (when (m4--quoted-p (match-beginning 0))
             (string-to-syntax "."))))))

(add-hook 'm4-mode-hook
          (lambda () (set (make-local-variable 'syntax-propertize-function)
                          m4-syntax-propertize)))

Обратите внимание, что syntax-propertize-function существует только в достаточно последних версиях Emacs (> = 24.1, IIRC).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .