Как использовать переменные vim во внешней команде фильтра в визуальном режиме? - PullRequest
5 голосов
/ 09 февраля 2012

Я пытаюсь заставить код довольно симпатичного фильтра принтера (например, perltidy) принимать произвольные опции в зависимости от переменных vim. Моя цель - передать определенные параметры проекта внешней команде, используемой в качестве фильтра (:!) В визуальном режиме.

Следующее выражает мое намерение (последняя строка проблематична):

" set b:perltidy_options based on dirname of the currently edited file
function! SetProjectVars()
  if match(expand("%:p:h"), "/project-foo/") >= 0
    let b:perltidy_options = "--profile=$HOME/.perltidyrc-foo --quiet"
  elseif match(expand("%:p:h"), "/project-bar/") >= 0
    let b:perltidy_options = "--profile=$HOME/.perltidyrc-bar --quiet"
  else
    let b:perltidy_options = "--quiet"
  endif
endfunction

" first set the project specific stuff
autocmd BufRead,BufNewFile * call SetProjectVars()

" then use it
vnoremap ,t :execute "!perltidy " . b:perltidy_options<Enter>

Однако последняя строка (vnoremap) является ошибкой в ​​vim, поскольку она расширяется до:

:'<,'>execute "!perltidy " . b:perltidy_options

и команда execute не может принять диапазон. Но я хотел бы иметь это:

:execute "'<,'>!perltidy " . b:perltidy_options

Как я могу это сделать?

p.s. Мой perltidy настроен на работу как фильтр unix, и я использую vim 7.3.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Вы можете использовать <C-\>e и getcmdline() для сохранения содержимого командной строки:

vnoremap ,t :<C-\>e'execute '.string(getcmdline()).'."!perltidy " . b:perltidy_options'<CR><CR>

, но в этом случае я бы предложил более простой <C-r>=, который устраняет необходимость в :execute:

vnoremap ,t :!perltidy <C-r>=b:perltidy_options<CR><CR>
2 голосов
/ 09 февраля 2012

Если вы когда-нибудь захотите избавиться от диапазона в командном (бывшем) режиме, CRL-u сделает именно это.

vnoremap ,t :execute "!perltidy " . b:perltidy_options<Enter>

становится

vnoremap ,t :<C-u>execute "!perltidy " . b:perltidy_options<CR>

: h c_CTRL-у

Счастливого Вимминга,

-Луки

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