Как я могу написать скрипт vim для запуска perltidy в буфере? - PullRequest
13 голосов
/ 27 февраля 2010

На моей нынешней работе у нас есть стандарты стиля кодирования, которые отличаются от тех, которым я обычно следую. К счастью, у нас есть постоянный RC-файл для perltidy, который я могу применить для переформатирования файлов, прежде чем отправить их в наш процесс проверки.

У меня есть код для emacs, который я использую для запуска команды над буфером и замены буфера выводом, который я адаптировал для этого. Но я иногда чередую emacs и vim, и хотел бы, чтобы там были такие же возможности. Я уверен, что это или что-то подобное просто и было сделано и переделано много раз. Но мне не повезло найти примеры vim-script, которые, кажется, делают то, что мне нужно. Который, по сути, должен быть в состоянии нажать комбинацию клавиш (например, Ctrl-F6, которую я использую в emacs) и переформатировать буфер на месте с помощью perltidy. Хотя я и удобный пользователь vim, я совершенно не в силах писать подобные вещи для vim.

Ответы [ 5 ]

11 голосов
/ 01 декабря 2011

После попытки ответа @hobbs я заметил, что при фильтрации всего буфера через perltidy курсор вернулся к байту 1, и мне пришлось мысленно записать исходный номер строки, чтобы я мог вернуться после завершения :Tidy .

Итак, основываясь на ответах @hobbs 'и @ Ignacio, я добавил следующее к своему .vimrc:

"define :Tidy command to run perltidy on visual selection || entire buffer"
command -range=% -nargs=* Tidy <line1>,<line2>!perltidy

"run :Tidy on entire buffer and return cursor to (approximate) original position"
fun DoTidy()
    let l = line(".")
    let c = col(".")
    :Tidy
    call cursor(l, c)
endfun

"shortcut for normal mode to run on entire buffer then return to current line"
au Filetype perl nmap <F2> :call DoTidy()<CR>

"shortcut for visual mode to run on the the current visual selection"
au Filetype perl vmap <F2> :Tidy<CR>

(закрытие " добавлено в комментарии для подсветки синтаксиса SO (не обязательно, но допустим синтаксис vim))

DoTidy() вернет курсор в исходное положение плюс или минус самое большее X байт, где X - это количество байтов, добавленных / удаленных на perltidy относительно исходной позиции курсора. Но это довольно тривиально, пока вы держите вещи в порядке:).

[версия Vim: 7.2]

РЕДАКТИРОВАТЬ: Обновлен DoTidy() для включения комментария @ mikew для удобства чтения и совместимости с Vim 7.0

9 голосов
/ 27 февраля 2010

Моя аккуратная команда:

command -range=% -nargs=* Tidy <line1>,<line2>!
  \perltidy (your default options go here) <args>

Если вы используете визуальное выделение или предоставляете диапазон, он будет приводить в порядок выбранный диапазон, иначе он будет использовать весь файл. Вы можете поместить набор параметров по умолчанию (если они есть) в тот момент, когда я написал (your default options go here), но любые аргументы, которые вы указываете :Tidy, будут добавлены к командной строке perltidy, переопределяя ваши значения по умолчанию. (Если вы используете .perltidyrc, у вас могут не быть аргументов по умолчанию - это нормально - но с другой стороны, вы можете захотеть иметь значение по умолчанию, например --profile=vim, которое устанавливает значения по умолчанию только для работы в vim. Все, что работает .)

9 голосов
/ 27 февраля 2010

Команда для фильтрации всего буфера через внешнюю программу:

:%!command

Введите следующее в ~/.vimrc, чтобы связать его с Ctrl-F6 в обычном режиме:

:nmap <C-F6> :%!command<CR>

Для дополнительного удовольствия:

:au Filetype perl nmap <C-F6> :%!command<CR>

Это отобразит фильтр только при редактировании файла Perl.

4 голосов
/ 13 марта 2010

Продолжая отвечать Хоббсу, вы можете сопоставить эту команду с сочетанием клавиш:

command -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q
noremap <C-F6> :Tidy<CR>

И еще один шаг вперед: отображайте команду только тогда, когда вы находитесь в буфере Perl (поскольку вы, вероятно, не захотите запускать perltidy на любом другом языке):

autocmd BufRead,BufNewFile *.pl,*.plx,*.pm command! -range=% -nargs=* Tidy <line1>,<line2>!perltidy -q
autocmd BufRead,BufNewFile *.pl,*.plx,*.pm noremap <C-F6> :Tidy<CR>

Теперь вы можете нажать Ctrl-F6 без активного выделения, чтобы отформатировать весь файл, или с активным выделением, чтобы отформатировать только этот раздел.

0 голосов
/ 28 февраля 2010

Я привык выделять текст с помощью линейно-ориентированного изображения Shift + V , а затем я нажимаю : и у меня есть !perltidy -pbp -et4 где-то в истории Я нажимаю один или несколько раз стрелку вверх .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...