ISO Emacs [C] Perl-mode着色哈希引用,如哈希

时间:2018-05-30 16:14:14

标签: perl emacs cperl-mode

我仍然使用Perl,一些新代码,并维护旧代码。我使用emacs和cperl-mode。我喜欢语法着色。

起初(很多年前)我不喜欢cperl-mode对数组和哈希的特殊着色,但它在我身上发展了。我有时更喜欢使用哈希而不是哈希引用,只是为了得到特殊的颜色。这听起来可能不是那么糟糕 - 但是如果我承认偶尔使用全局%hash或$ hash {key}而不是对象成员$ hashref-> {key},那么只是为了获得着色,这很糟糕。即语法着色让我想要遵循糟糕的编程习惯。

所以,我的问题是:是否有人使用emacs / elisp配置代码获取cperl-mode或perl-mode来着色哈希引用,如$ hashref-> {key}与$ hash {key相同或相似}?

让我用粗体来表示可能有颜色的地方:

  • cperl-mode现在执行: $ hash {key}
  • 我想要的是: $ hash-> {key}

我已经在emacs中对着色(面部)进行了大量的自定义 - 例如着色以区分DEBUG代码和非调试代码,TEST来自非测试等等 - 但我还没有设法在cperl-mode工作中获得这种语法着色。 (关注:我最终得到了font-lock-add-keywords,如下面我对自己问题的回答所示。)

在下面的示例中,您可以看到$ hashref-> {key}未着色,而$ hash {key}是。

example of cperl-mode syntax coloring

类似于数组引用,也许还有其他引用。

我意识到着色引用只适用于像$ hashref-> {key}这样的deref,而不适用于$ hashref1 = $ hashref2等其他内容。我认为我可以忍受。

3 个答案:

答案 0 :(得分:3)

您可以将cperl-highlight-variables-indiscriminately设置为t(通过自定义)以使标量变量不仅在声明时始终着色。 enter image description here

@ref$ref使用相同的颜色会让人感到困惑,因为它们是不同的变量类型(和不同的变量);同样地,使用$ref的标量颜色但$ref->[0]的数组颜色令人困惑,因为它们是同一个变量。

另外,Perl是Perl,你会在这里使用所有三种颜色吗?

if (ref $ref eq 'ARRAY') {
    return $ref->[0]
} elsif (ref $ref eq 'HASH') {
    return $ref->{key}
}

答案 1 :(得分:3)

我不喜欢回答我自己的问题,但这个疯狂的追逐回答建议让我烦恼,弄清楚我的尝试做错了什么。

(当我要求X时,我讨厌它,有人回答Y,并且忽略X.尤其是当X可行时,就像这里一样。)

以下是我的.emacs的工作代码:

(defun ag-extend-cperl-font-lock-keywords ()
  (interactive)
  (font-lock-add-keywords
    'cperl-mode
    '(
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\){"
         1 'cperl-hash-face t
         )
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\)\\["
         1 'cperl-array-face t
         )
       (
         "\\($[a-zA-Z_][a-zA-Z_0-9]*->\\)("
         1 'font-lock-function-name-face t
         )
       )
    t
    )
  )

(ag-extend-cperl-font-lock-keywords)

enter image description here

只是为了笑,@ choroba的多种类型的例子:

enter image description here

我还没决定是否应该为hashrefs,arrayrefs和coderefs创建单独的面。目前,只使用与非参考对手相同的面孔。包括 - >作为彩色文本的一部分,在非参考和参考之间提供了一些区别。

我还没有决定是否要扩展到其他各种Perl语法。 来自https://perldoc.perl.org/perlref.html

enter image description here

但是现在我有了font-lock-add-keywords调用,这些细节我可以在闲暇时修复。

答案 2 :(得分:0)

如果不延长cperl-mode,就无法做到你想要的。 cperl-mode不了解参考文献。没有参考“面子”供您自定义,也没有“东西”可以应用该面孔。如果你想像哈希一样呈现哈希引用(例如你的例子),我首先要修改t-font-lock-keywords-1cperl-mode.el定义中的the second regex。这应该照顾哈希和数组引用。注意cperl-highlight-variables-indiscriminately覆盖您的更改。如果你想做一些比较漂亮的事情,比如有一个“参考面孔”,你就必须

  1. 定义一张脸
  2. 添加面部以进行自定义(如果需要)
  3. hack t-font-lock-keywords-1并将脸部应用于正则表达式匹配
  4. 当然,向上游发送功能请求可能更容易。 cperl-mode是古老的,绝对可以使用一些现代化。