如何在不在 emacs 中启动注释语法的情况下正确解释 M4 的 $# 变量?

如何在不在 emacs 中启动注释语法的情况下正确解释 M4 的 $# 变量?

我有以下 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)。

相关内容