5

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

if ($a==1){
   &err_report("$a");
while($b!=1){
                      &err_ok();
}
}

Я хочу переформатировать его в Vim. После использования команды gg=G код форматируется как:

if ($a==1){
&err_report("$a");
while($b!=1){
&err_ok();
}
}

На самом деле, я хочу отформатировать его в Vim, как показано ниже:

if ($a==1){
  &err_report("$a");
  while($b!=1){
    &err_ok();
  }
}

Что я должен делать?


  • После использования vim-perl автоформатирование все еще не делает то, что я хочу.

3 ответа3

4

Предполагая, что вы работаете в Unix-подобной операционной системе ...

Используйте Perltidy (настраиваемый индентор / форматировщик Perl-кода). Затем обновите файл ~/.vimrc включив в него следующее:

filetype plugin indent on
autocmd FileType perl setlocal equalprg=perltidy\ -st

Это позволит вам пометить любой блок кода Perl, который вы хотите, а затем переформатировать его, нажав =. Это предполагает, что perltidy находится в вашем $PATH , в противном случае просто укажите полный путь к исполняемому файлу.

По умолчанию perltidy отформатирует ваш код как

if ( $a == 1 ) {
    &err_report("$a");
    while ( $b != 1 ) {
        &err_ok();
    }
}

... но используя -i=2 (--indent-columns=2) и -pt=2 (--paren-tightness=2) (вы бы поместили эти параметры в файл ~/.perltidyrc , по одному на строку ) ты получаешь

if ($a == 1) {
  &err_report("$a");
  while ($b != 1) {
    &err_ok();
  }
}

Это в значительной степени то, что вы просили.

Если вы действительно не должны иметь место после того, как while когда - либо, использовать -nsak=while в то время как --nospace-after-keyword=while в то время).

0

Vim поставляется с плагином для отступа Perl, и если у вас есть :filetype indent on где-то в вашем стартапе (например, vimrc), он должен иметь возможность делать отступы для файлов Perl. Но обратите внимание, что он будет только делать отступы, он не будет добавлять или удалять переводы строки.

0

Сначала установите необходимые параметры форматирования, например, set cindent sw=2 expandtab (используйте C-подобные отступы, отступ 2 пробела, расширите символ табуляции до пробелов). Затем сделайте отступ для всего файла / буфера.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .