长话短说:
我是学生,在我的一门课程中,我们必须使用/学习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
答案 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
等。