如何在可视模式下在外部过滤器命令中使用 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】:

您可以使用&lt;C-\&gt;egetcmdline() 来保留命令行内容:

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

,但在这种情况下,我建议使用更简单的&lt;C-r&gt;=,它消除了对: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 变量?的主要内容,如果未能解决你的问题,请参考以下文章

10-vim-选中命令-01-三种选择文本的方式

vim的一些常用命令

如何通过 Vim 中的外部命令过滤不跨越整行的可视选择的内容?

VIM

vim技巧

vim快捷键