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