【问题标题】:Emacs major mode for emerald. Correct highlightingEmerald 的 Emacs 主模式。正确突出显示
【发布时间】:2015-02-15 13:11:42
【问题描述】:

长话短说:

我是一名学生,在我的一门课程中,我们必须使用/学习emerald programming language。在快速谷歌搜索后,我发现有人已经为它写了一个主要模式。 Link to the script

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

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

我是整个主要模式的新手,为 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

【问题讨论】:

    标签: emacs comments syntax-highlighting major-mode


    【解决方案1】:

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

    第二个问题:你可以在major mode hook中调用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 定义了一组字体锁定关键字,但从未添加它们。如果您将以下几行添加到您的 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 等。

    【讨论】:

    • 谢谢,我今晚放学回来看看 :)
    • 我不太明白你解释天气问题的部分是否在语法表中。这是我的情况:我的 .emacs 文件中有这个: (load "~/Downloads/font-lock-studio-master/font-lock-studio.el") (load "~/.emacs.d/lisp/ emerald-mode.el") 并且语法着色是错误的,因为现在加载了 emerald-mode.el。我确实通过 M-x font-lock-studio 启动了 font-lock-studio,它拆分了我的屏幕,但在此之前语法突出显示已经错误。
    • 此外,当我在启动时同时加载了 font-lock 和 Emerald-mode 时,我运行 emacs,然后 Mx font-lock-studio 我收到以下错误: 调试器输入--Lisp 错误:(错误-number-of-arguments (lambda (regexp) "模拟查看,但向后工作" (and (save-excursion (re-search-backward regexp (min (point-min) (- (point) 100)) t)) (= (point) (match-end 0)))) 3) 回顾("" 78 t) font-lock-fontify-syntactically-region(# # 中 192 处的标记(插入后移动)...
    • 是的,现在它不会弄乱其他模式的语法着色谢谢 :) 但它根本没有语法颜色翡翠源。根据我对字体锁定系统的了解,emerald-mode.el 定义了 emerald-font-lock-keywords 中的语法突出显示,但它们不起作用。有任何想法吗 ? (我将包含一个测试 hello world 程序。)
    • 我添加了您在 emerald-mode.el 中提到的块,并且语法着色现在在某种程度上起作用。感谢您的帮助 :) 我将不得不研究我可以在哪里插入 kill-all-local-variables 这样它就不会保留来自 Objective C 的语法着色或加载的任何其他内容。
    猜你喜欢
    • 2011-02-27
    • 2010-09-24
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多