Emacs中perl的语法突出显示被破坏,是否有修复?

Emacs中perl的语法突出显示被破坏,是否有修复?,perl,emacs,cperl-mode,Perl,Emacs,Cperl Mode,我是一名perl程序员和一名新的emacs用户。我在Windows下,使用cperl模式编辑perl。Emacs版本是24.2.1。下面是一个带有一些示例代码的屏幕截图: (来源:) 明显的错误:它在注释中突出显示了(a=>“b”)样式列表中的数组、散列和非引号文本值 还有一个错误:它将正则表达式中的第一个字作为数组高亮显示,因为它使用了非默认引号符号 这不是一个bug,但看起来很奇怪:当数组和散列被使用时,它会在任何时候高亮显示(即使在注释中也是如此),但是标量只有在声明时才会高亮显示 不是一

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


(来源:)

  • 明显的错误:它在注释中突出显示了(a=>“b”)样式列表中的数组、散列和非引号文本值
  • 还有一个错误:它将正则表达式中的第一个字作为数组高亮显示,因为它使用了非默认引号符号
  • 这不是一个bug,但看起来很奇怪:当数组和散列被使用时,它会在任何时候高亮显示(即使在注释中也是如此),但是标量只有在声明时才会高亮显示
  • 不是一个bug,但看起来很奇怪:函数的情况也一样:声明时突出显示,而不是调用时突出显示
  • 不是一个bug,但看起来很奇怪:为什么“打印”、“说”和“系统”有不同的颜色
  • 我可以继续,但我希望这能很好地解释“破碎”这个词

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

    “打印”具有cperl不可覆盖的面。“模具”有字体锁定关键字面。同时,两者都是函数,可以(并且经常)重写。“系统”具有字体锁定类型面。为什么?函数声明具有字体锁定函数名面-这没关系,但“use”的参数也是如此。为什么?函数调用和标量根本没有face属性,无法突出显示。为什么?等等,等等,我可以继续

    有没有办法解决这些问题?是否有一些配置可以将词法单位重新映射到其他字体面,或者有一些其他方法可以使语法突出显示不那么疯狂

    为了避免“perl是不可解析的”的说法,下面是我从中迁移的编辑器的屏幕截图,代码非常相同:。看起来更合理


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


    是的,你说得对:似乎emacs社区在perl存在的25年里,没能做出一个好的perl语法。这是一个悲惨的故事。

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


    至于“声明时突出显示,而不是调用时突出显示”,这是因为Emacs通常以这种方式突出显示。我发现突出显示变量和函数的使用没有任何好处。我在
    perl模式下一直强调变量的使用
    ,主要是因为它以前就存在,我不想与不满的用户打交道。另外,对于Perl,突出显示变量声明和使用可能更容易,就像突出显示
    perl模式
    一样,而
    cperl模式
    必须做额外的工作来区分这两种情况。

    另一个突出显示snafu的语法与Emacs cperl模式有关,它与用于注释代码块的POD注释有关。以下是演示的屏幕截图:

    在上面的“不推荐”示例中,很容易忽略使用POD指令而不使用空行填充的注释掉的代码。在Emacs中查看它时,它不会作为注释出现在你的眼前,特别是如果注释块很大并且跨越多个屏幕页面,以至于“=cut”行甚至不在视图中

    值得注意的是,vim的Perl模式正确地突出显示了POD,而不需要按照POD规范使用空行填充,尽管我要提醒vim用户避免依赖该功能,并使用空行填充和“=开始注释…=结束注释”指令,如上所示

    如果Perl有一个更简单的多行注释语法la'/*…*/'而不是被滥用的POD机制。也许有一天我们会在Perl 6中得到它


    在Emacs中执行多行注释的另一种方法(对于任何语言)是通过内置的“字符串矩形”:C-xrt,然后键入“#”。要取消对块的注释,请手动执行或编写一个简单的宏

    我只是生活在这样的环境中。考虑设置<代码> CpPL突出显示变量< <代码> > <代码> t>代码>。