如何在Emacs / ESS语法高亮显示中更改变量颜色?

时间:2013-10-27 15:26:45

标签: emacs ess

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

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

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

tangotango theme

如果我深入研究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模式似乎确实尊重字体锁:

perl

2 个答案:

答案 0 :(得分:1)

你正在寻找一个错误的地方。 ess-font-lock定义主题。大约10年前这是有用的。现在有一些通用的主题,比如你的探戈和ESS不会干扰它们。

问题是ESS没有定义您要查找的字体锁定关键字。原因是< - 是赋值运算符,R中没有explisit变量定义语句.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 font-lock系统之上实现了灵活的字体锁定制机制。请参阅ESS&gt; font-lock子菜单。

enter image description here

答案 1 :(得分:0)

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

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

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

但这是一个丑陋的解决方法 - 你不应该这样做。考虑针对ess-mode.el代码提交错误。它不应该践踏用户设置,例如面孔。如果它想要默认更改外观,那么它应该为用户提供面,他们可以自定义,而不是简单地用硬编码方式拧紧现有面