【问题标题】:How can I fix Emacs' syntax highlighting of qr"\.[^.]+$"?如何修复 Emacs 的 qr"\.[^.]+$" 语法高亮?
【发布时间】:2011-11-27 00:09:11
【问题描述】:

Emacs 在一行之后的语法令人困惑

fileparse($file, qr"\.[^.]+$");

并且认为文件的其余部分是一个字符串。我该如何解决这个问题?

【问题讨论】:

  • 这不是因为 Perl 正则表达式,而是因为您选择的模式标记。坚持使用标准的/,除非您的模式中包含/,如果您希望您的代码易于被其他人阅读。 “医生,我这样向后弯胳膊很疼。” “好吧,那就不要那样弯曲你的手臂!”
  • 您是否使用cperl-mode(如果不是,您应该使用)?在 Emacs 24 上我不会感到困惑。

标签: regex perl emacs syntax-highlighting


【解决方案1】:

Emacs 被qr 表达式中的引号弄糊涂了。标准正则表达式分隔符 (/) 有效:

fileparse($file, qr/\.[^.]+$/);

事实上,几乎所有其他方法似乎都有效。

fileparse($file, qr{(\.[^.]+$/});
fileparse($file, qr*\.[^.]+$*);
fileparse($file, qr#\.[^.]+$#);

我的 VIM 版本不会被引号弄糊涂,但我知道旧版本的 VIM 会。加上引号确实令人困惑,因为它使qr 表达式看起来像一个字符串(它不是)。在正则表达式中使用引号作为分隔符通常是不好的策略,即使它在技术上是合法的。

然而,真正重要的问题是fileparse 是什么?这不是标准的 Perl 函数。我假设这是从File::Basename 导入的?对吗?

根据我的文档,fileparse 中的第二个参数应该是一个数组,而不是一个带引号的正则表达式。

【讨论】:

  • 如果给定@suffixes,每个元素都是与$filename结尾匹配的模式(字符串或qr//)。所以,OP有一个由单个元素组成的后缀列表。没有错。
  • emacs如何使用'作为分隔符?那是一种用于防止插值的方法。我无法检查,因为 Emacs 把我吓坏了:-P
【解决方案2】:

David W. 可能有正确的答案。同样,最好避免使用" 作为分隔符,但有时您需要使用' 作为分隔符以防止插值,因此在这种情况下这可能对某人有用。

因此,如果出于某种原因您真的想要引号分隔符(或为了防止使用 ' 进行插值),您可以随时执行以下操作:

fileparse($file, qr"\.[^.]+$"); #"# highlight fix

一个使用 SO 做得不好的例子:

s'hi'by'; #'# highlight fix

注意:第二个# 是触发编辑器中的注释高亮,以便highlight fix 显示为注释。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2011-02-11
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多