Я пытаюсь заставить код довольно симпатичного фильтра принтера (например, 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.