Emacs中perl的语法高亮显示已被破坏,是否有修复?

时间:2012-10-30 12:25:12

标签: perl emacs cperl-mode

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

http://breqwas.net/dropbox/perlsyn_emacs.png

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

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

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

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

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

为了避免“perl is notarsarsible”的讨论,这里是我正在迁移的编辑器的屏幕截图,使用完全相同的代码:http://breqwas.net/dropbox/perlsyn_pn.png。看起来更合理。


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

是的,你做对了:似乎emacs社区无法在25年内制作一个好的perl语法,perl就是这样。那是一个悲伤的故事。

2 个答案:

答案 0 :(得分:3)

您可能想要perl-mode而不是cperl-mode。如果您发现其中缺少功能,我们可以从cperl-mode移植它们而不会有太多麻烦。 perl-mode突出显示的内容不如cperl-mode那么华丽,但它确实解决了您指出的一些问题。

至于#34;在声明时突出显示,而不是在被叫时#34;这是因为Emacs通常以这种方式突出显示。我发现突出变量和函数用途没有任何好处。我在perl-mode中一直强调变量用法,主要是因为它之前存在,我并不想处理心怀不满的用户。此外,在Perl的情况下,可能更容易突出显示变量声明并使用与perl-mode相同的用法,而cperl-mode必须做额外的工作来区分这两种情况。

答案 1 :(得分:0)

使用Emacs cperl-mode强调要注意的另一种语法与用于注释掉代码块的POD注释有关。这是一个演示截图:

cperl-mode syntax highlighting bug demo

非常容易错过使用POD指令的注释掉的代码,而不使用空行填充,因为我的“不推荐”#39;上面的例子。在Emacs中查看时,它只是作为评论而不会引起注意,特别是如果评论的块很大并跨越多个屏幕页面,那么' = cut'即使在视线中也没有。

值得注意的是, vim 的Perl模式正确地突出了POD而不需要每个POD规范的空白行填充,但我会提醒vim用户避免依赖该功能并使用空白行填充和' =开始评论... =结束评论'如上所示的指令和as recommended

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

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