Emacs高亮显示:如何处理因特殊字符的异常使用而混乱的高亮显示?

时间:2019-05-05 01:02:10

标签: emacs highlight font-lock

问题:

在Emacs配置模式(例如conf-xdefaults-modeconf-space-mode)中,某些特殊字符以不寻常的方式使用,例如在定义键绑定时。这会弄乱缓冲区其余部分的突出显示。

示例:

护林员rc.conf文件使用conf-space-mode,极大地提高了可读性。但是这样的行:

map #  console shell -p%space
map "<any>  tag_toggle tag=%any

突出显示突出显示的内容,因为#通常定义注释,后跟font-lock-comment-face直到行尾,而"定义字符串的开头,后跟{{ 1}},直到遇到引号。

对这些字符进行转义不是一个选择,因为这会阻止它们定义键绑定。

可能的解决方案:

我能想到的最好的解决方案是摆弄那些配置模式的字体锁定设置,以去除那些特殊字符之后的突出显示。但是我会在合适的时候在这些字符之后放掉适当的突出显示。

一种折衷方法是在font-lock-string-face之后继续突出显示,因为这只会弄乱一行,并且这些配置文件中有很多注释,而在单引号和双引号之后则删除突出显示,因为这些会弄乱整个缓冲区的其余部分和字符串在配置文件中并不常见。

问题:

应对这些情况的正确方法是什么?

是否可以在缓冲区中的某个点重置高亮显示?还是插入一个会影响突出显示(修复它)而不影响代码的字符?还是有一种仅在不影响代码的情况下“转义”某些字符以突出显示的方法?

1 个答案:

答案 0 :(得分:1)

简单的方法

忍受它可能最容易,但要保持约束。在这里,我采用了ranger的默认rc.conf,并重新排列了一些font-lock错误。

example font-lock errors in ranger's rc.conf file

让我们暂时忽略蓝色的“地图”。我们有两个可见的字体锁定错误。 map #...字体锁定为注释,map "...字体锁定为字符串到缓冲区末尾。第一个错误是自约束的。注释在该行的结尾处结束。我们通过添加注释来限制第二个错误。 (我不知道ranger是否在行的中间接受注释,因此我仅在此处使用行首注释。)

constraining the first string-delimiter error

第二个错误现在限制为一行,但是又弹出了另外两个错误。快速调整这些,我们会得到。

our example errors, fixed

这是我可以忍受的,因为我整天不在conf文件中(相对于源代码)。如果我们的新“评论”可以包含在同一文件中,那将变得更加整洁。线。

艰难的道路

您将要使用Emacs font-lock-add-keywords。让我们回到第一张图片中的蓝色map。之所以显示为蓝色,是因为conf-space-mode认为应该在font-lock-type-face中渲染字符串,然后加上任意数量的空格,再加上左括号(触发该操作的实际正则表达式为^[_space__tab_]*\\(.+?\\)[_space__tab_\n]*{[^{}]*?$,其中{ {1}}和_space_是实际的空格和制表符。)

我们可以通过评估以一种简单的方式覆盖它

_tab_

,然后使用(font-lock-remove-keywords 'conf-space-mode '(("^\\<\\(map\\)\\>" 1 font-lock-variable-name-face))) 重新加载缓冲区。现在,每当单词“ map”出现在行的开头时,它都将显示为C-x C-v RET(在我们的示例中为黄色)。

您可以通过将钩子添加到初始化文件中来使此更改永久生效。

font-lock-variable-name-face

该方法似乎不适用于注释((add-hook 'conf-space-mode-hook (lambda () (font-lock-remove-keywords nil '(("^\\<\\(map\\)\\>" 1 font-lock-variable-name-face))))) )和字符串(# ')分隔符,因为它们在语法表中已定义。修改语法表以提供特殊情况可能需要付出更多的努力。

相关问题