如何在可视模式下在外部过滤器命令中使用 vim 变量?
Posted
技术标签:
【中文标题】如何在可视模式下在外部过滤器命令中使用 vim 变量?【英文标题】:How to use vim variables in an external filter command in visual mode? 【发布时间】:2012-02-08 21:52:06 【问题描述】:我正在尝试使代码漂亮的打印机过滤器(例如 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 "'<,'>!perltidy " . b:perltidy_options
我该怎么做?
附言我的 perltidy 被配置为像 unix 过滤器一样工作,我使用 vim 7.3。
【问题讨论】:
【参考方案1】:您可以使用<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】:如果您想在命令(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,
-卢克
【讨论】:
以上是关于如何在可视模式下在外部过滤器命令中使用 vim 变量?的主要内容,如果未能解决你的问题,请参考以下文章