Почему vim делает отступ в моем Perl-коде неправильно? - PullRequest
6 голосов
/ 26 октября 2011

У меня есть подпрограмма в 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;
}

Почему это так? Как я могу это исправить?

РЕДАКТИРОВАТЬ: Следует отметить, что я использую gvim 7.3 на Windows.

Ответы [ 4 ]

9 голосов
/ 27 октября 2011

Может быть, это волшебное мышление, но… Раньше у меня было:

filetype plugin on
filetype indent on 

в моем _vimrc (в Windows XP, скомпилированное gvim, различные версии), и я получалвсевозможные интересные проблемы с отступами в файлах Perl, LaTeX и HTML.

Теперь у меня есть

filetype indent on 
filetype plugin on

, и все кажется бесполезным.YMMV.

Кроме того, я настоятельно рекомендую vim-perl Энди Лестера .

3 голосов
/ 26 октября 2011

cindent относится к языку c и не работает при использовании со многими другими языками. То, что вы, вероятно, хотите использовать, это filetype plugin indent on. Вы можете добавить это к своему .vimrc, и vim определит правильный синтаксис / отступ для большинства языков из коробки. Вы также можете легко добавить направляющие синтаксиса / отступа, если у vim их еще нет.

2 голосов
/ 26 октября 2011

Моя система правильно вставляет ваш код, используя filetype indent on (против filetypepluginindent on).[Vim 7.2]

1 голос
/ 19 июля 2017

Отследил эту проблему до причуды в сопоставителе регулярного выражения vim, в файле отступа perl.vim есть несколько мест, где регулярное выражение включает в себя попытку экранировать [в коллекции с \ [....

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

, но по какой-либо причине \ [соответствует любому \ или [в строке, а не только [чтобы исправить файл отступа vim, не закрывайте левые скобки во всех операторах соответствия, т.е. ...

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