【问题标题】:Vi isn't handling curly braces in my perl script correctlyVi 没有正确处理我的 perl 脚本中的花括号
【发布时间】:2014-10-27 01:14:00
【问题描述】:

Vi 弄乱了我的 perl 脚本! 虽然代码末尾的 { 与任何右花括号都不匹配,但第 27 行和第 28 行末尾的 {s 与第 30 行的 } 匹配。

这是 Vi 如何处理我的脚本行为的屏幕视频。


(来源:abbasinasab.com

这也是我的麻烦代码:

#CODE                                                                                                               
while ($data =~ m{                                                                                                      
    ^foo_\s+ $X \s* \{                                                                                                  
        ( (?: [^{}]+ | \{(?1)\} )* )                                                                                    
    \}                                                                                                                  
}mgx)                                                                                                                   
{                                                                                                                       
    my $Y = $1;                                                                                                         
    next if $Y !~ m{                                                                                                    
        bar_$Z \s* \{                                                                                                   
            ( (?: [^{}]+ | \{(?1)\} )*? )                                                                               
        \}                                                                                                              
    }mx;                                                                                                                

    my $DO = $1;                                                                                                        
    #CODE                                                                                                               
} 

我的问题是:

  1. 在这种情况下,Vi 如何以及为什么不能处理花括号。
  2. 如何重写我写得丑陋的代码以避免这种对 Vi 的混淆。

【问题讨论】:

  • 您可以为m 使用任何分隔符。喜欢:seq 350 | perl -lanE 'say $_ if m 1331',但建议只使用标点符号,例如:/@ 或成对的()[]<> 等。
  • Perl 非常难以解析,尤其是使用/gmx 修饰符(尤其是/x 修饰符)。
  • Perl 实际上无法解析。 perlmonks.org/?node_id=663393
  • 如果你认为这是 vim-perl 处理这些大括号的一个错误(很可能是),请向 vim-perl 项目提交票证:github.com/vim-perl/vim-perlvim-perl is我们在其中整理了与 Perl 相关的 Vim 文件,这些文件被折叠回 Vim 发行版。你也可以尝试使用 vim-perl 项目中的语法文件,看看最新版本是否比你现在使用的任何版本的 Vim 更健壮。
  • 嗯,很抱歉这个离题的问题,但是你用什么来制作这个小截屏视频? :P

标签: regex perl vim vi curly-braces


【解决方案1】:

Vim 中有两个功能可以被复杂的语法所欺骗:

  • 'matchpairs' 突出显示和跳转使用内部启发式。这可能会受到轻微影响(cp.:help cpo-M):
:set cpo+=M

有了这个,% 正确地跳转到预期的右括号(除非你有一个像 matchpairs.vim 这样的插件覆盖% 命令)。另请注意,'cpoptions' 设置是全局的,因此这可能会对其他文件类型产生不利影响。

  • 语法高亮是基于正则表达式的。因此,它会因无法用正则表达式忠实建模(但需要自定义解析器)的极端情况和复杂语法(如 C++ 和 Perl)而失败。

一般来说,我会避免重写代码,只是为了让编辑满意。其他人可能使用不同的编辑器,很快代码就会因各种此类“变通方法”而严重扭曲。唯一的例外是代码明显复杂和繁琐,并且通过重组可以提高总体可读性。

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 2015-11-09
    • 2012-01-18
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多