我正在尝试使代码漂亮的打印机过滤器(例如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。
答案 0 :(得分:2)
如果您想要在命令(ex)模式下摆脱范围, CRL-u就是这么做的。
vnoremap ,t :execute "!perltidy " . b:perltidy_options<Enter>
变为
vnoremap ,t :<C-u>execute "!perltidy " . b:perltidy_options<CR>
:h c_CTRL-u
快乐的vimming,
路加福音
答案 1 :(得分:2)
您可以使用<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>