#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)