Vi搞砸了我的perl脚本

时间:2014-09-02 17:26:44

标签: regex perl vim vi curly-braces

Vi弄乱了我的perl脚本! 虽然代码末尾的{与结束的大括号不匹配,但第27和28行末尾的{匹配30的相同}

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

mini-screencast demonstrating the issue http://www.abbasinasab.com/data/uploads/sc-4.gif

这也是我的麻烦制造者代码:

#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. 在这种情况下,如何以及为什么不能处理大括号。
  2. 如何重写我丑陋的代码片段以避免Vi的混淆。

1 个答案:

答案 0 :(得分:4)

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

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

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

  • 语法突出显示是基于regexp的。因此,它将因极端情况和复杂语法(如C ++和Perl)而失败,这些语法无法使用正则表达式忠实地建模(但需要自定义解析器)。

一般情况下,我会避免重写代码,以便编辑器满意。其他人可能会使用不同的编辑器,很快代码就会被各种类似的"变通办法"大大扭曲。唯一的例外是当代码明显复杂和繁琐时,一般的可读性会从重组中得到改善。