Автоформат для Perl в Vim

3068
Marslo

У меня есть кусок плохо отформатированного кода 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 автоформатирование все еще не делает то, что я хочу.
5
vim хорош в синтаксической подсветке, но очень плох в автоформате. Может быть, кто-нибудь сможет сказать что-нибудь полезное. До тех пор +1. peterh 9 лет назад 0
@PeterHorvath Может быть, некоторые инструменты могут соединиться с vim и сделать vim мощным ... :) Marslo 9 лет назад 0
@ Марсло работает на меня. Есть ли в vimrc `плагин filetype indent on` и` set ft? `Возвращает` filetype = perl`? FDinoff 9 лет назад 0
Привет, @FDinoff, [Это мой vimrc] (https://github.com/Marslo/VimConfig/blob/master/Configurations/vimrc), для отступа `filetype plugin on` задано значение [строка 110] (https: //github.com/Marslo/VimConfig/blob/master/Configurations/vimrc#L110). Вы добавили несколько плагинов для синтаксиса Perl? Marslo 9 лет назад 0
@Marslo Нет. Я могу повторить поведение с помощью `vim -u NONE -N a.pl -c 'отступа плагина типа файла при' -c 'обнаружении типа файла'`, что означает, что это не моя конфигурация vim. Я бегу vim 7.4.258. FDinoff 9 лет назад 1
@FDinoff, ах да !!! Вы правы!! Я думаю, что проблема может быть вызвана плагинами .... Marslo 9 лет назад 0
Ну .. Я нашел, что `gg = G` работает для` vim -u NONE -N a.pl` ТАКЖЕ! Без каких-либо настроек для плагина, отступа, типа файла ... Marslo 9 лет назад 0

3 ответа на вопрос

4
Kusalananda

Предполагая, что вы работаете в 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
Atafar

First set the required formatting options, e.g., set cindent sw=2 expandtab (use C-like indentation, indent 2 spaces, expand tab character to spaces). Then indent the whole file/buffer.

0
Heptite

Vim comes with a Perl indent plugin, and as long as you have :filetype indent on somewhere in your startup (such as your vimrc) it should be able to do indenting of Perl files for you. But note that it will only do indenting, it won't add or remove newlines.