我想选择一个文本块(例如V%
)并使用该文本作为shell命令的输入(例如wc
或pbcopy
) - 但我不要' T想要改变当前缓冲区 - 我只想查看命令的输出(如果有的话),然后继续编辑而不做任何改动。
键入V%!wc
会转换为:'<,'>!wc
并切换wc
命令输出的文本块。
如何在不影响当前缓冲区的情况下将一大块文本传输到任意shell命令?
答案 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 -l
。 wc -l
只计算传递给它的行数。
v
jjjj
:
,其中Vim 将翻译为:'<,'>
w !wc -l
,您的完整命令行现在应为:'<,'>w !wc -l
我不明白在第3步和第4步究竟发生了什么,但我确实知道它有效。
答案 3 :(得分:0)
我知道这不是理想的解决方案,但如果所有其他方法都失败了,您可以在运行命令后按 u 撤消缓冲区更改。