Emacs突出显示:如何处理由于特殊字符的异常使用而造成的突出显示混乱?
问题: 在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
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文件(如您所说)来说,下面有这样奇怪的注释是可以的。至少,现在缓冲区是可读的。感谢您花时间编写这样一个详细的答案。