Vim - map shell命令

时间:2012-02-20 15:52:29

标签: map vim

我的.vimrc中有以下说明:

map t :!../tt <C-R><C-W> <CR><CR>

它工作得很好:vim从文件中获取单词并运行../t word。但令人讨厌的是,当命令运行时,vim返回shell一段时间然后返回文件。我不需要看到命令输出,所以有可能绕过这个恼人的闪光灯吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试

nnoremap <silent> t :<C-u>silent !../tt <C-r>=shellescape(expand('<cword>'), 1)<CR><CR><C-l>

nnoremap <silent> t :<C-u>call system('../tt '.shellescape(expand('<cword>')))<CR>

甚至

nnoremap <expr> <silent> t system('../tt '.shellescape(expand('<cword>')))[-1]

。注意一些事情:

  1. 除非您有特定原因,否则请勿使用map(不含nnore)。我相信您不需要这种映射用于可视和操作员挂起模式(前导n仅限制映射到正常模式),您也不应该希望此映射可重映射。
  2. 使用<C-u>来丢弃您偶尔可以输入的计数,除非您确实知道需要它(第三个版本使用两个黑客,将映射转换为带有副作用的无操作且不需要<C-u> )。
  3. 永远不要忘记逃避shell参数。
  4. 带有silent !的版本(不要忘记silent之后的空格,这就是为什么@David Pope的答案不起作用)最后有<C-l>。这是因为使用!总是提供对终端的访问权限,因此在命令运行后需要重绘。
  5. 如果添加包含换行符的参数,则system()的版本将无效,这是一个记录错误。如果您不想这样做(expand('<cword>')将不会添加换行符),那绝对是安全的。
  6. t是一个非常有用的动议。最好学会使用它然后重新映射到某些东西。我建议,t作为lhs。

答案 1 :(得分:0)

我相信这应该有用。

map <silent> t :silent!../tt <C-R><C-W> <CR><CR>

但我没有你的应用程序,所以我无法测试stderr vs. stdout vs. etc。我不知道vim中是否有问题。