emerald 的 Emacs 主要模式。正确突出显示

Emacs major mode for emerald. Correct highlighting

长话短说:

我是一名学生,在我的一门课程中,我们必须 use/learn emerald programming language. After a quick google search I found that somebody already wrote a major-mode for it. Link to the script

问题:在第一个注释行“%...”之后,语法高亮停止。因此所有后续行都没有任何语法突出显示。这是非常烦人的。

Emerald 没有多行注释。只有一行注释是语言语法的一部分。一行注释以“%”开始,以行尾结束。

我是整个主要模式的新手,正在为 emacs 编写 lisp 脚本...等等

问题:谁能帮我弄清楚语法高亮到底出了什么问题?为什么它在第一行评论后停止?以及如何修复它?

其他快速问题: 如何使 emacs 突出显示其他语言关键字?例如对象、导出、操作、函数...等等?

提前致谢:)

编辑:这是一个简单的 hello world 测试程序,用于演示语法高亮显示:

%this object pronts a hello message on screen
const hello <- object hello
  var n : integer <-  0

  operation gs[] -> [ret: integer]
    n <- n + 1
    ret <- n
    return
  end gs

  % a comment
  % second comment
  % third comment
  initially
    stdout.putstring["Hello World!\n"]
  end initially
end hello

第一个问题:可以使用https://github.com/Lindydancer/font-lock-studio包单步执行font-lock关键字。问题可能出在 font-lock 关键字之一,或者出在语法 table(用于突出显示注释和字符串)中。如果在您开始 font-lock-studio 之后(即在应用任何字体锁定关键字之前),突出显示不正确,那么问题出在语法 table.

第二个问题:您可以在主模式挂钩中调用font-lock-add-keywords来添加新的font-lock关键字。有关格式的说明,请参阅变量 font-lock-keywords。但是,描述有点隐晦,所以我也建议您在网上搜索一些好的例子。

更新: 安装后 emerald-mode 我可以重现您看到的问题。根本原因是该模式以不兼容的方式实现了核心 Emacs 功能(Emacs 提供的最多三个参数)。如果删除以下函数并重新启动 Emacs,字体锁定似乎会起作用。

(defun looking-back (regexp)
  "Simulates a looking-at, but works backwards"
  (and (save-excursion
     (re-search-backward regexp (min (point-min) (- (point) 100)) t))
       (= (point) (match-end 0))))

请注意,如果没有 font-lock-studio,我无法找到它,因为正常的字体锁定会默默地忽略错误,而 font-lock-studio 会进入 lisp 调试器(如果 debug-on-error 为非零) .

更新 2:似乎 emerald-mode 定义了一组字体锁定关键字,但从未添加它们。如果您将以下行添加到您的初始化文件中,它似乎可以工作:

(defun my-emeral-mode-hook ()
  (setq font-lock-defaults '(emerald-font-lock-keywords nil t))
  (font-lock-mode 1))
(add-hook 'emerald-mode-hook 'my-emeral-mode-hook)

我注意到 emerald-mode 急需删除。例如,主模式不调用kill-all-local-variables,这意味着它保留了之前主模式的所有局部变量。 (更好的解决方案是使用 define-derived-mode 而不是使用普通的 defun 来定义模式。)它将 font-lock-keywords-case-fold-search 设置为全局变量而不是通过 font-lock-defaults 等。