Emacs为祖母绿的主要模式。正确突出显示

时间:2015-02-15 13:11:42

标签: emacs comments syntax-highlighting major-mode

长话短说:

我是学生,在我的一门课程中,我们必须使用/学习emerald programming language。经过快速的谷歌搜索,我发现有人已经为它写了一个主模式。 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

1 个答案:

答案 0 :(得分:0)

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

第二个问题:您可以在主模式挂钩中调用font-lock-add-keywords来添加新的字体锁定关键字。有关格式的说明,请参见变量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会默默地忽略错误,而font-lock-studio会进入lisp调试器(如果debug-on-error非零)。< / p>

更新2 emerald-mode似乎定义了一组font-lock关键字,但从不添加它们。如果将以下行添加到init文件中,它似乎可以工作:

(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等。