vim:执行shell命令而不进行过滤

时间:2009-08-06 09:09:06

标签: vim shell

我想选择一个文本块(例如V%)并使用该文本作为shell命令的输入(例如wcpbcopy) - 但我不要' T想要改变当前缓冲区 - 我只想查看命令的输出(如果有的话),然后继续编辑而不做任何改动。

键入V%!wc会转换为:'<,'>!wc并切换wc命令输出的文本块。

如何在不影响当前缓冲区的情况下将一大块文本传输到任意shell命令?

4 个答案:

答案 0 :(得分:83)

选择您的文本块,然后输入以下键:w!sh

整个事情应该是这样的:

:'<,'>w !sh

就是这样。我只花了8年时间学习那个:)

注意:输入:选择文字后产生:'&lt;,'&gt;表示选择开始和结束的范围。

2016年更新:这只是通用的一种用途:

'<,'>w !cli_command

这基本上允许您将文件的任意部分“发送”到外部命令,并在不改变缓冲区的情况下在临时vi窗口中查看结果。其他有用的例子是:

'<,'>w !wc
'<,'>w !to_file my_file

老实说,我发现改变当前缓冲区更有用。这种变化很简单:

'<,'>!wc
'<,'>!to_file my_file

答案 1 :(得分:4)

一种可能性是在自定义命令中使用system(),如下所示:

command! -range -nargs=1 SendToCommand <line1>,<line2>call SendToCommand(<q-args>) 

function! SendToCommand(UserCommand) range
    " Get a list of lines containing the selected range
    let SelectedLines = getline(a:firstline,a:lastline)
    " Convert to a single string suitable for passing to the command
    let ScriptInput = join(SelectedLines, "\n") . "\n"
    " Run the command
    let result = system(a:UserCommand, ScriptInput)
    " Echo the result (could just do "echo system(....)")
    echo result
endfunction

用(例如):

调用
:'<,'>SendToCommand wc -w

请注意,如果按V%:,系统会为您输入:'<,'>

:help command
:help command-range
:help command-nargs
:help q-args
:help function
:help system()
:help function-range

答案 2 :(得分:1)

更新:我的回答是胡说八道。

@ pixelearth的答案很好,但我在理解他所做的事情上有点麻烦,所以我写了以下内容。这一系列命令允许您在视觉选择上执行wc -lwc -l只计算传递给它的行数。

  1. 在Vim中使用v
  2. 进入可视模式
  3. 选择以下几行:jjjj
  4. 键入:,其中Vim 翻译为:'<,'>
  5. 输入w !wc -l,您的完整命令行现在应为:'<,'>w !wc -l
  6. 按Enter键获取命令的结果(在此示例中为4)
  7. 按Enter继续编辑
  8. 我不明白在第3步和第4步究竟发生了什么,但我确实知道它有效。

答案 3 :(得分:0)

我知道这不是理想的解决方案,但如果所有其他方法都失败了,您可以在运行命令后按 u 撤消缓冲区更改。