6

我在 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

4 回答 4

10

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

filetype plugin on
filetype indent on 

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

我现在有

filetype indent on 
filetype plugin on

一切似乎都是笨拙的。YMMV。

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

于 2011-10-26T21:50:19.890 回答
3

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

于 2011-10-26T16:39:20.660 回答
2

filetype indent on我的系统使用(与)正确缩进您的代码。[Vim 7.2]filetypepluginindent on

于 2011-10-26T16:50:09.643 回答
1

将此问题跟踪到 vim 正则表达式匹配器中的一个怪癖,在 perl.vim 缩进文件中,有几个地方正则表达式包括尝试使用 \[... 转义集合中的 [。

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

但无论出于何种原因, \[ 匹配行中的任何 \ 或 [ 不仅仅是 [ 所以要修复 vim 缩进文件,在所有匹配语句中取消左括号,即...

 let bracepos = match(line, '[(){}[\]]', bracepos + 1)
于 2017-07-18T21:12:44.230 回答