为什么vim缩进我的Perl代码?

时间:2011-10-26 16:34:16

标签: perl vim indentation vim-perl

我在Perl中有一个子程序,应该像这样缩进:

sub GetFiles 
{
    my $pwd = shift;
    my @input = @_;
    my @returned;

    my @DirectoryContent = &GetContentInformation(@input);

    foreach (@DirectoryContent) 
    {
        my %current = %{$_};

        if ($current{'info'} =~ /<DIR>/) 
        {
            my $RecurseDir = &GetRecurseDir($pwd, \%current);
            push(@returned, &GetFiles($RecurseDir, 
                    &GetDirectoryContents($RecurseDir)));
        }
        else 
        { 
            # clean up the data
            my $size = $current{'info'};
            # filesize will be in number of bytes
            # remove file separators
            #$size =~ s/,//g; 
            my $extension = &GetFileExtension($current{'name'});
            delete($current{'info'});
            $current{'size'} = $size;
            $current{'extension'} = $extension;
            # push(@returned, \%current);
        }
     }
     @returned;
}

但是当我按下=%(是的,cindent打开),光标位于子程序块的起始括号时,它会像这样缩进:

sub GetFiles 
{   
    my $pwd = shift;
    my @input = @_;
    my @returned;

    my @DirectoryContent = &GetContentInformation(@input);

    foreach (@DirectoryContent) 
    {
        my %current = %{$_};

        if ($current{'info'} =~ /<DIR>/) 
        {
            my $RecurseDir = &GetRecurseDir($pwd, \%current);
        push(@returned, &GetFiles($RecurseDir, &GetDirectoryContents($RecurseDir)));
    }
    else 
    { 
        # clean up the data
        my $size = $current{'info'};
        # filesize will be in number of bytes
        # remove file separators
        #$size =~ s/,//g; 
        my $extension = &GetFileExtension($current{'name'});
        delete($current{'info'});
        $current{'size'} = $size;
        $current{'extension'} = $extension;
        # push(@returned, \%current);
    }
}
@returned;
}

为什么这样做?我该如何解决?

编辑:应该注意我在Windows上使用gvim 7.3。

4 个答案:

答案 0 :(得分:9)

也许这是一种神奇的想法,但......我曾经有过:

filetype plugin on
filetype indent on 

在我的_vimrc(在Windows XP上,自编gvim,各种版本),我会在Perl,LaTeX和HTML文件中得到各种有趣的缩进问题。

现在,我有

filetype indent on 
filetype plugin on

并且一切似乎都是大块头。 YMMV。

另外,我强烈推荐Andy Lester's vim-perl

答案 1 :(得分:3)

cindent特定于c语言,与许多其他语言一起使用时会被破坏。您可能想要使用的是filetype plugin indent on。您可以将其添加到.vimrc,vim将为大多数开箱即用的语言找出正确的语法/缩进。如果vim还没有它们,你也可以很容易地添加语法/缩进指南。

答案 2 :(得分:2)

我的系统使用 filetype indent on (而非filetype plugin indent on)正确缩进代码。 [Vim 7.2]

答案 3 :(得分:1)

将这个问题追溯到vim正则表达式匹配器中的一个怪癖,在perl.vim缩进文件中,有几个地方正则表达式包含尝试使用\ [.... <转义[在集合中] / p>

 **let bracepos = match(line, '[(){}\[\]]', bracepos + 1)**

但无论出于什么原因\ [匹配任何\或[不在线] [ 所以要修复vim缩进文件unescape所有匹配语句中的左括号,即......

 let bracepos = match(line, '[(){}[\]]', bracepos + 1)
相关问题