【问题标题】:Syntax highlight for perl in Emacs is broken, is there a fix?Emacs 中 perl 的语法高亮已损坏,是否有修复?
【发布时间】:2012-10-19 18:56:01
【问题描述】:

我是一个 perl 程序员和一个新的 emacs 用户。我在 Windows 下,使用 cperl-mode 来编辑 perl。 Emacs 版本是 24.2.1。这是带有一些示例代码的屏幕截图:


(来源:breqwas.net

  1. 明显的错误:它在 (a => "b" ) 样式列表 cmets 内部 中突出显示数组、哈希和未引用的文字值
  2. 还有一个错误:由于非默认引号符号,它会将正则表达式中的第一个单词作为数组高亮显示
  3. 不是错误,但看起来很奇怪:它会在使用数组和散列时随时突出显示(即使在 cmets 中,呵呵),但标量仅在声明时才会突出显示
  4. 不是错误,但看起来很奇怪:功能相同:在声明时突出显示,而不是在调用时突出显示
  5. 不是错误,但看起来很奇怪:为什么“print”、“say”和“system”有不同的颜色?

我可以继续说下去,但我希望这能很好地解释“破碎”这个词。

然后我学会了神奇的 C-u C-x = 组合键,它显示光标下文本的文本属性等,希望能做出更好的自己的配色方案。在这一点上,它开始变得更没有意义了。

“打印”具有 cperl-nonoverridable-face。 "die" 有 font-lock-keyword-face。同时,两者都是函数,可以(并且经常)被覆盖。 “系统”有 font-lock-type-face。为什么?函数声明有 font-lock-function-name-face - 这没关系,但“使用”的参数也是如此。为什么?函数调用和标量根本没有 face 属性,无法突出显示。为什么?等等等等。再说一次,我可以继续前进。

有没有办法解决这一切?是否有一些配置可以让我将词法单元重新映射到其他字体,或者其他方式让语法高亮不那么疯狂?

为了避免“perl 无法解析”的说法,这里是我要迁移的编辑器的屏幕截图,代码完全相同:http://breqwas.net/dropbox/perlsyn_pn.png。看起来更合理。


更新:到目前为止(在这里问这个问题 3 周后)我还没有找到治愈方法。我认识的所有使用 emacs 的 perl 程序员都忽略了这些问题。似乎没有更好的用于 emacs 的 perl 荧光笔。阅读 cperl-mode 文档提供了一些解释(现在各种元素的面孔选择似乎不那么疯狂了),但没有提供任何答案。我给 cperl-mode 维护者写了一封电子邮件,提出了这些问题,并进行了一些挖掘,但没有得到回复。

是的,你没看错:似乎 emacs 社区在 perl 出现的 25 年里无法做出好的 perl 语法高亮。这是一个悲伤的故事。

【问题讨论】:

  • 我只是忍受它。考虑将cperl-highlight-variables-indiscriminately 设置为t

标签: perl emacs cperl-mode


【解决方案1】:

您可能想尝试perl-mode 而不是cperl-mode。如果您发现其中缺少的功能,我们也许可以从cperl-mode 移植它们,而不会有太多麻烦。 perl-mode 的突出显示不如 cperl-mode 的花哨,但它确实解决了您指出的一些问题。

至于“声明时高亮,调用时不高亮”,这是因为 Emacs 通常采用这种方式高亮显示。我发现突出显示变量和函数用途的好处为零。我在perl-mode 中保留了变量使用的突出显示,主要是因为它以前就在那里,我不想与心怀不满的用户打交道。此外,在 Perl 的情况下,突出显示变量声明和使用与 perl-mode 相同可能更容易,而 cperl-mode 必须做额外的工作来区分这两种情况。

【讨论】:

    【解决方案2】:

    使用 Emacs cperl-mode 时要注意的另一种突出显示问题的语法与用于注释代码块的 POD cmets 相关。这是演示的屏幕截图:

    很容易错过使用 POD 指令而没有空白行填充的注释掉的代码,就像我上面的“不推荐”示例中一样。在 Emacs 中查看它时,它只是不会作为评论引起您的注意,特别是如果评论块很大并且跨越多个屏幕页面,因此“=cut”行甚至不在视图中。

    值得注意的是,vim 的 Perl 模式可以正确突出 POD,而不需要根据 POD 规范进行空行填充,但我会提醒 vim 用户避免依赖该功能并使用空行填充和 '=begin comment ...=end comment' 指令如上所示和as recommended

    如果 Perl 有一个更简单的多行注释语法,比如 la '/* ... */',而不是容易被滥用的 POD 机制,那就太好了。也许有一天我们会在 Perl 6 中得到这个?

    在 Emacs(对于任何语言)中执行多行 cmets 的另一种方法是通过内置的 'string-rectangle':C-x r t 然后输入 '#'。要取消注释块,请手动执行或编写一个简单的宏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2011-02-11
      • 1970-01-01
      • 2023-01-03
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多