4

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


(来源:breqwas.net

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

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

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

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

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

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


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

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

4

2 回答 2

3

您可能想尝试perl-mode而不是cperl-mode. 如果您发现其中缺少的功能,我们也许可以cperl-mode毫不费力地移植它们。 perl-mode的突出显示没有cperl-mode' 那样华而不实,但它确实解决了您指出的一些问题。

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

于 2012-10-30T14:24:49.750 回答
0

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

cperl-mode 语法高亮错误演示

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

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

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

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

于 2014-03-19T03:30:34.093 回答