Как я могу script vim запускать perltidy в буфере?
В моей текущей работе у нас есть стандарты стиля кодирования, которые отличаются от тех, которые я обычно следую. К счастью, у нас есть консервированный файл RC для perltidy
, который я могу применить к файлам форматирования, прежде чем я отправлю их в наш процесс обзора.
У меня есть код для emacs, который я использую для запуска команды над буфером и заменяю буфер на выход, который я адаптировал для этого. Но я иногда чередуюсь между emacs и vim и хотел бы иметь там те же возможности. Я уверен, что это или что-то подобное простое и было сделано и переделано много раз. Но мне не повезло найти примеры vim- script, которые, похоже, делают то, что мне нужно. Это, по существу, возможность ударить ключевую комбо (например, Ctrl-F6, то, что я использую в emacs), и переустановить буфер на месте perltidy
. В то время как я удобный пользователь vim, я совершенно не знаю, как писать такие вещи для vim.
Ответы
Ответ 1
После попытки ответа @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]
EDIT: Обновлен DoTidy()
, чтобы включить комментарий @mikew для чтения и совместимости с Vim 7.0
Ответ 2
Команда для фильтрации всего буфера через внешнюю программу:
:%!command
Поместите следующее в ~/.vimrc
, чтобы связать его с Ctrl-F6 в обычном режиме:
:nmap <C-F6> :%!command<CR>
Для дополнительного удовольствия:
:au Filetype perl nmap <C-F6> :%!command<CR>
Это будет отображать фильтр только при редактировании файла Perl.
Ответ 3
Моя аккуратная команда:
command -range=% -nargs=* Tidy <line1>,<line2>!
\perltidy (your default options go here) <args>
Если вы используете визуальный выбор или предоставляете диапазон, то он будет выбирать выбранный диапазон, иначе он будет использовать весь файл. Вы можете поместить набор параметров по умолчанию (если они есть) в том месте, где я написал (your default options go here)
, но любые аргументы, которые вы предоставили :Tidy
, будут добавлены в командную строку perltidy
, переопределяя ваши значения по умолчанию. (Если вы используете .perltidyrc
, у вас могут не быть аргументы по умолчанию - это хорошо - но опять же вы можете захотеть иметь по умолчанию, например --profile=vim
, который устанавливает значения по умолчанию только тогда, когда вы работаете в vim..)
Ответ 4
Взяв hobbs на следующий шаг, вы можете сопоставить эту команду с клавишей быстрого доступа:
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 без активного выбора для форматирования всего файла или с помощью активного выделения для форматирования только этой секции.
Ответ 5
Я использую для выбора текста, используя визуализацию с ориентацией линии Shift + V, а затем нажимаю : а у меня есть !perltidy -pbp -et4
где-то в истории, поэтому я ударяю один или несколько стрелок вверх ⇧.