我有以下 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
其实,#
在 前面加上 也可以开始注释$
。是否#
开始注释取决于它是否在引用的文本中。
您可以尝试下面的代码来让 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)。