Emacs突出显示:如何处理由于特殊字符的异常使用而造成的突出显示混乱?

Emacs突出显示:如何处理由于特殊字符的异常使用而造成的突出显示混乱?,emacs,highlight,font-lock,Emacs,Highlight,Font Lock,问题: 在Emacs配置模式中(例如conf xdefaults模式或conf space模式),一些特殊字符以不寻常的方式使用,例如当它们定义键绑定时。这会弄乱缓冲区其余部分的高亮显示 示例: ranger rc.conf文件使用conf空间模式,这大大提高了文件的可读性。但是,一些行,例如: map # console shell -p%space map "<any> tag_toggle tag=%any map#控制台外壳-p%空间 映射“标记”\u切换标记=%any

问题:

在Emacs配置模式中(例如
conf xdefaults模式
conf space模式
),一些特殊字符以不寻常的方式使用,例如当它们定义键绑定时。这会弄乱缓冲区其余部分的高亮显示

示例:

ranger rc.conf文件使用
conf空间模式
,这大大提高了文件的可读性。但是,一些行,例如:

map #  console shell -p%space
map "<any>  tag_toggle tag=%any
map#控制台外壳-p%空间
映射“标记”\u切换标记=%any
打乱高亮显示,因为
#
通常定义注释,后跟
字体锁定注释面
,直到行尾,
定义字符串的开头,后跟
字体锁定字符串面
,直到遇到结束引号

转义这些字符不是一个选项,因为它会阻止它们定义键绑定

可能的解决方案:

我能想到的最好的解决方案是,在那些配置模式中修改字体锁定设置,以删除那些特殊字符后的突出显示。但如果合适的话,我会在这些字符之后取消适当的突出显示

一种折衷方法是在
#
之后保持高亮显示,因为这只会弄乱一行,并且这些配置文件中有很多注释,而在单引号和双引号之后删除高亮显示,因为这些会弄乱缓冲区的整个剩余部分,并且字符串在配置文件中并不常见

问题:

处理这些情况的正确方法是什么

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

简单的方法 这可能是最简单的生活方式,但要保持克制。在这里,我使用了
ranger
的默认
rc.conf
,并重新安排了一些
字体锁定
错误

让我们暂时忽略蓝色的“地图”。我们有两个可见的字体锁定错误。
map#…
将字体锁定为注释,
map“…
将字体锁定为字符串,并将其映射到缓冲区的末尾。第一个错误是自我约束的。注释在行的末尾结束。第二个错误是通过添加注释来约束的。(我不知道<代码> Ranger-会接受中间的注释,所以我只在这里使用在线评论。)

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

这是我可以接受的,因为我不是整天都在conf文件中(而不是说源代码)。如果我们的新“注释”可以包含在同一行中,那就更整洁了

艰难的道路 您需要使用Emacs。让我们回到第一个图像中的蓝色
映射
。它呈现为蓝色是因为
配置空间模式
认为应该在
字体锁定类型面
中呈现一个字符串,后跟任意数量的空格,后跟一个大括号(触发此操作的实际regexp是
^[\u space\u\u tab\u]*\(.+?\\)[\u space\u tab\u\n]*{[^{}]*?$
其中
\u space\u
\u tab\u
是实际的空格和制表符。)

我们可以通过计算

(字体锁定删除关键字)
'配置空间模式
“((“^\\”1字体锁定变量名面)))
然后用
C-x C-v RET
重新加载缓冲区。现在,每次单词“map”出现在行首时,它都被呈现为
font-lock variable name face
(在我们的示例中为黄色)

通过向init文件添加一个钩子,可以使此更改永久化

(添加hook'conf空间模式hook(lambda()
(字体锁定)删除关键字
无
'((“^\\”1字体锁定变量名面()()))

此方法似乎不适用于您的注释(
)和字符串(
”)语法表中定义的分隔符。修改语法表以提供特殊情况可能需要付出更多的努力。

谢谢!我完全可以接受这种简单的方法,而您添加注释的想法正是我想要的技巧。内联注释在ranger的conf文件中不起作用(和许多其他conf文件一样),但是对于conf文件(如您所说)来说,下面有这样奇怪的注释是可以的。至少,现在缓冲区是可读的。感谢您花时间编写这样一个详细的答案。