【问题标题】:How to use vim variables in an external filter command in visual mode?如何在可视模式下在外部过滤器命令中使用 vim 变量?
【发布时间】: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。

【问题讨论】:

    标签: vim


    【解决方案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,

      -卢克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 2020-05-28
        • 2013-07-01
        • 1970-01-01
        相关资源
        最近更新 更多