【问题标题】:How to change variable color in Emacs/ESS syntax highlighting?如何在 Emacs/ESS 语法高亮中更改可变颜色?
【发布时间】:2013-10-27 15:26:44
【问题描述】:

我正在使用主题为 tangotango.el 的 Emacs 24.3 和 ESS 13.05。虽然主题看起来很平静,但 R 中的变量名称似乎没有突出显示。在tangotango-theme.el 我可以找到以下行:

 `(font-lock-variable-name-face ((t (:foreground "tomato"))))

但这似乎没有任何效果。例如,在下面的屏幕截图中,我希望变量 orl 以某种红色突出显示。相反,它是该主题的标准文本颜色。

如果我深入研究 ESS,有一个名为 ess-font-lock.el 的文件,其中包含对变量名称 face 的一些引用,例如:

  (set-face-foreground 'font-lock-variable-name-face "Black"))

所以看起来font-lock-variable-name-face 有相互竞争的定义。我不明白 Emacs 主题和这些 ESS 定义之间的交互。 ESS 是否覆盖了 tangotango 主题,如果是,是否会更改 ess-font-lock.el 中的上述行以恢复变量名突出显示?还是我应该完全寻找其他地方?

编辑:请注意Cperl 模式似乎确实尊重字体锁定:

【问题讨论】:

    标签: emacs ess


    【解决方案1】:

    你找错地方了。 ess-font-lock 定义主题。大约 10 年前,这很有用。现在有像你的探戈探戈这样的通用主题,ESS 不会干扰它们。

    问题在于 ESS 没有定义您正在寻找的字体锁定关键字。原因是

    foo <- function(){}
    

    信不信由你,但您真的不想突出显示您的所有作业。你可以试试:

    (defvar ess-R-fl-keyword:assign-vars
      (cons "\\(\\(?2:\\s\"\\).+\\2\\|\\sw+\\)\\s-*\\(<-\\)"
            '(1 font-lock-variable-name-face)))
    
    (add-to-list 'ess-R-font-lock-keywords '(ess-R-fl-keyword:assign-vars . t) t)
    

    ESS 在 emacs 字体锁定系统之上实现了灵活的字体锁定自定义机制。请参阅 ESS>font-lock 子菜单。

    【讨论】:

    • 我不知道这个菜单。我已经成功地添加了新项目 - 很好的可扩展性 - 并且正在使用它来查看它的运行情况。感谢您的澄清。
    【解决方案2】:

    是的,听起来很像。如果您仅在该模式下看到问题,并且该模式显式地改变了面部,那么这听起来像是罪魁祸首。但是,您不需要更改源代码。做这样的事情(未经测试):

     (add-hook 'ess-mode (lambda () (set-face-foreground "tomato")))
    

    (我认为这是正确的模式名称;如果不是,请更正。)

    但这是一个丑陋的解决方法——你不应该这样做。考虑针对ess-mode.el 代码提交错误。它不应该那样践踏用户设置,例如面部。如果它想在默认情况下改变外观,那么它应该给用户一个面,他们可以自定义,而不是简单地以硬编码的方式与现有的面相混淆.

    【讨论】:

    • 谢谢。我将 add-hook 逐字放在我的 ESS 初始化文件的末尾,但它似乎没有任何效果。我也试过(add-hook 'ess-mode (lambda () (set-face-foreground 'font-lock-variable-name-face "tomato"))),但这似乎也不起作用。根据您上面的评论(“如果您仅在该模式下看到问题”),我检查了CPerl 模式并且突出显示在那里正常工作。也许@VitoshKa 会在某个时候出现并澄清。
    • @SlowLearner:是的,我忘记了set-face-foreground 的面部变量参数。
    • @SlowLearner:检查该模式是否实际上称为ess-mode。在lambda开头打个电话(debug),看看人脸前景变化会发生什么。但我可以猜测问题在于覆盖面部前景的是模式本身,之后你的钩子函数将它设置为你想要的。如果是这样,那么您别无选择,只能重新定义(或建议)模式功能(例如,ess-mode)。除非该模式定义了另一个钩子,您可以在它改变面部后使用它。
    • 看ESS代码(文件ess-font-lock.el),好像有自己的“主题”。查看函数(defun ess-font-lock-*,每个函数都会改变font-lock-variable-name-face和其他面孔。您可能需要重新定义这些功能中的每一个。但是看看代码,看看它是否没有为用户提供自定义行为的方法。很难相信这种面部变化会被硬编码,而用户没有其他选择。
    • @SlowLearner:我没有时间详细检查代码——你可以看看。但也许你可以关掉ess-font-lock-mode。它的文档说:“*Non-nil 表示我们对 ESS 缓冲区使用字体锁定支持。默认为 t,使用字体锁定支持。如果您更改此变量的值,请重新启动 Emacs 以使其生效。”
    猜你喜欢
    • 2010-11-07
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多