【问题标题】:Emacs highlighting: how to deal with highlighting messed up by unusual usage of special characters?Emacs 高亮显示:如何处理因特殊字符的异常使用而导致的高亮显示?
【发布时间】:2019-05-06 00:37:08
【问题描述】:

问题:

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

示例:

ranger rc.conf 文件使用conf-space-mode,这极大地提高了它的可读性。但如:

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

弄乱了突出显示,因为# 通常定义一个注释,然后是font-lock-comment-face,直到行尾," 定义字符串的开头,然后是font-lock-string-face,直到遇到关闭引用。

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

可能的解决方案:

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

折衷方案是在# 之后继续突出显示,因为这只会弄乱一行,并且这些配置文件中有很多 cmets,同时删除单引号和双引号后的突出显示,因为这些会弄乱整个其余部分缓冲区和字符串在配置文件中并不常见。

问题:

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

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

【问题讨论】:

    标签: emacs highlight font-lock


    【解决方案1】:

    简单的方法

    忍受它可能是最简单的,但要限制事情。在这里,我把ranger的默认rc.conf重新整理了一些font-lock的错误。

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

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

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

    艰难的路

    你会想要使用 Emacs font-lock-add-keywords。让我们回到第一张图片中的蓝色map。它呈现蓝色是因为conf-space-mode 认为应该在font-lock-type-face 中呈现一个字符串,后跟任意数量的空格,后跟一个左大括号(触发它的实际正则表达式是^[_space__tab_]*\\(.+?\\)[_space__tab_\n]*{[^{}]*?$,其中_space__tab_是实际的空格和制表符。)

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

    (font-lock-remove-keywords
     'conf-space-mode
     '(("^\\<\\(map\\)\\>" 1 font-lock-variable-name-face)))
    

    并使用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)))))
    

    此方法似乎不适用于您的注释 (#) 和字符串 ('") 定界符,因为它们是在语法表中定义的。修改语法表以提供特殊情况可能需要付出更多的努力。

    【讨论】:

    • 谢谢!我完全可以接受简单的方法,而您添加评论的想法正是我正在寻找的那种技巧。内联 cmets 在 ranger 的 conf 文件中不起作用(就像在许多其他 conf 文件中一样),但是对于 conf 文件(如您所说),下面有那个奇怪的评论是好的。至少,现在缓冲区是可读的。感谢您花时间写出如此详细的答案。
    猜你喜欢
    • 2014-04-07
    • 2012-03-11
    • 1970-01-01
    • 2015-11-01
    • 2011-12-13
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多