Автоформат для Perl в Vim
У меня есть кусок плохо отформатированного кода 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 ответа
Предполагая, что вы работаете в 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
).
Vim поставляется с плагином Perl Indent, и до тех пор, пока у вас есть :filetype indent on
где-то в вашем стартапе (например, в vimrc) он сможет сделать отступ для файлов Perl. Но обратите внимание, что он будет только делать отступы, он не будет добавлять или удалять переводы строки.
Сначала установите необходимые параметры форматирования, например, set cindent sw=2 expandtab
(используйте C-подобные отступы, отступ 2 пробела, расширяйте символ табуляции до пробелов). Затем сделайте отступ для всего файла / буфера.