Почему vim делает отступы в моем коде Perl неправильно?

#perl #vim #indentation #vim-perl

#perl #vim #отступ #vim-perl

Вопрос:

У меня есть подпрограмма в Perl, которая должна иметь такой отступ:

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

    my @DirectoryContent = amp;GetContentInformation(@input);

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

        if ($current{'info'} =~ /<DIR>/) 
        {
            my $RecurseDir = amp;GetRecurseDir($pwd, %current);
            push(@returned, amp;GetFiles($RecurseDir, 
                    amp;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 = amp;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 = amp;GetContentInformation(@input);

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

        if ($current{'info'} =~ /<DIR>/) 
        {
            my $RecurseDir = amp;GetRecurseDir($pwd, %current);
        push(@returned, amp;GetFiles($RecurseDir, amp;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 = amp;GetFileExtension($current{'name'});
        delete($current{'info'});
        $current{'size'} = $size;
        $current{'extension'} = $extension;
        # push(@returned, %current);
    }
}
@returned;
}
 

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

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

Комментарии:

1. Я не знаю perl, но проблема в %current том, что удаление «, похоже, позволяет vim правильно сделать отступ. Является ли это чем-то допустимым в perl — это другой вопрос.

2. Я не люблю загрязнять ответы, поэтому сначала я хотел бы спросить: знаете ли вы о perltidy?

3. @RandyMorris: это действительный perl, но удаление оператора позволило vim выполнить свою работу. возможно, в файле отступов есть небольшая ошибка, которую я, возможно, смогу исправить 🙂 спасибо за комментарий.

Ответ №1:

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

 filetype plugin on
filetype indent on 
 

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

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

 filetype indent on 
filetype plugin on
 

и все, кажется, хорошо. YMMV.

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

Комментарии:

1. На самом деле (и я этого не знал) vim-perl Энди Лестера — это файл отступов perl, поставляемый с gvim 7.3. Однако редакция по состоянию на 3 июня 2009 года, и вверху есть задачи. Я проверю, обновил ли он свой файл.

2. Обновление файлов perl Энди Лестера сработало. Спасибо за совет и всем, кто помогает мне отследить ошибку :).

Ответ №2:

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

Комментарии:

1. Я отключаю свой cindent и вставляю filetype plugin indent on , но он по-прежнему дает аналогичные результаты. Проницательный ответ, однако 🙂

2. Я проверил это, и проблема все еще остается. Приношу свои извинения за отвлекающий маневр.

Ответ №3:

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

Комментарии:

1. это подтверждает мою теорию «ошибка в файле» (см. Комментарий выше).

2. попытка вашего кода на vim 7.3, он не работает должным образом. Спасибо, что указали версию, это помогло.

Ответ №4:

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

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

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

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