【问题标题】:Emacs Specifying Rules for font-lockEmacs 指定字体锁定规则
【发布时间】:2016-02-23 19:51:00
【问题描述】:

我正在将我正在学习的解析技术付诸实践。我正在尝试在 Emacs 中编写一种编程模式,因此我可以利用语法高亮等。不幸的是,字体锁定不起作用。在谷歌上搜索并按照教程发现那里没有产生任何结果。下面是我的代码。任何建议表示赞赏。

;;;###autoload
(defgroup use-mode nil
  "Mode for editing Use source files."
  :group 'languages)

;;;###autoload
(defcustom use-mode-hook nil
  "Hook run when use-mode is started.")

(defvar use-mode-map (make-sparse-keymap)
"Keymap for use-mode.")

;;;###autoload
(add-to-list 'auto-mode-alist '("\\.use\\'" . use-mode))

(defvar use-keywords-1 '("use" . font-lock-keyword-face)
  "First level of font-lock in Use")

(defvar  use-font-lock-keywords use-keywords-1
  "Code highlighting.")

;;;###autoload
(define-derived-mode use-mode prog-mode "Use"
  "Major mode for editing Use source files."
  (setq font-lock-defaults '(use-font-lock-keywords)))

(provide 'use-mode)

【问题讨论】:

  • 您确定要defcustom您的模式挂钩吗?一方面,define-derived-mode 自动定义了这样的钩子,但钩子通常是最终用户很少通过 Emacs 的自定义系统设置的东西,而是直接在 init 文件中设置。
  • 请不要自动加载变量(不是defcustoms),除非它绝对需要。

标签: emacs font-lock


【解决方案1】:

当您定义字体锁定关键字时,您应该提供一个条目列表。所以,如果你更换:

(defvar use-keywords-1 '("use" . font-lock-keyword-face)
  "First level of font-lock in Use")

使用以下内容,它将起作用:

(defvar use-keywords-1 '(("use" . font-lock-keyword-face))
  "First level of font-lock in Use")

请注意,除非您打算编写一个真正高级的系统,否则您不需要提供不同的级别,因此您可以删除 *-1 变量。

(以防万一你还没有看到它,我想推荐我的一个包,font-lock-studio。它是一个用于字体锁定关键字的交互式调试器。)

【讨论】:

  • 你确定吗?当我尝试您的解决方案时,我在 Emacs 24.3.1 中得到 Wrong type argument: listp
  • 我刚刚在 24.5 中尝试过这个。您是否重新评估了use-keywords-1use-font-lock-keywords?您是在什么情况下收到错误的?
  • 啊,我可能没有正确地重新评估,因为defvar 在第二次评估时不会重置值。 setq 救援——现在它工作得很好。点赞!
  • 不过,您如何看待在 use-font-lock-keywords 的定义中添加第二对括号,就像在我的答案的编辑中一样?
  • 通常,字体锁定关键字由规则列表组成。在这里,它只包含一个(use 的突出显示)。一旦您想添加第二条规则,您必须将其表示为规则列表。例如。 (defvar my-font-lock-keywords '(("use" . font-lock-keyword-face) ("var" . font-lock-variable-name-face)))。此外,如果您将某些东西命名为“关键字”(使用复数“s”),您会期望它是一个集合,而不仅仅是一个。此外,这也是过去 20 年来主要实施的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多