Vim:将选定的文本传递给shell cmd并在vim info /命令行上接收输出

ikw*_*yl6 52 vim shell command-line pipe

我想将所选文本传递给shell命令,并在vim info /命令行上从此shell命令接收单行输出?

我真正想做的事情:将所选文本传递给pastebin-type shell命令,我想接收shell cmd的输出(它是pastebin的http链接).这可能吗?

Epe*_*eli 105

对于多行版本,您可以在选择文本后执行以下操作:

:'<,'>:w !command<CR>
Run Code Online (Sandbox Code Playgroud)

您可以将其映射到简单的可视模式快捷方式,如下所示

xnoremap <leader>c <esc>:'<,'>:w !command<CR>
Run Code Online (Sandbox Code Playgroud)

在可视模式下按下领导键+ c,将所选文本发送到命令的标准输入.该命令的stdout将打印在vim的状态栏下方.

CoffeeScript的真实世界示例:

https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d

  • 仅供参考:省略`:w`将用命令的输出替换选择. (21认同)
  • 我不明白这个`:w`的语法和作用方式.这是正常的"写"命令吗?什么是第二个`:`for?你能解释一下吗?谢谢! (6认同)
  • @schoettl 我也想知道同样的事情!可以在 `:help :w` 下找到,特别是 `:help :w_c`。 (3认同)
  • 这适用于基于行的选择,但如果仅选择了行的特定部分,则这将不起作用 (2认同)

Neg*_*_EV 31

只需使用视线选择shift-v突出显示线条,点击:!并键入要将命令发送到的命令.然后,生成的输出将替换您选择的文本.

当您键入命令时,它将显示在底部:

:'<,'>!somecmd
Run Code Online (Sandbox Code Playgroud)

'<,'>表示您在视觉上选择的范围将传递给在!之后指定的命令.

  • 这只是将所选文本替换为shell cmd的输出. (8认同)
  • 这个版本有它的好处.执行此版本后,您可以复制/抽取命令输出.(选择使用shift-v并按y,如果是一行则选择yy等)撤消以获取原始版本.(点击你)然后粘贴(点击p)复制的命令输出.在当前缓冲区中为您提供原始数据和pastebin url,无需任何额外的vim配置,也无需使用鼠标来获取命令输出. (4认同)
  • 制作 somecmd `sh` 会将整行作为实际的 shell 命令执行。例如。`:'&lt;,'&gt;!sh` (2认同)

mat*_*ias 17

我会这样做:

将此函数放在vimrc中:

function Test() range
  echo system('echo '.shellescape(join(getline(a:firstline, a:lastline), "\n")).'| pbcopy')
endfunction
Run Code Online (Sandbox Code Playgroud)

这将允许您通过执行以下操作来调用此函数:

:'<,'>call Test()
Run Code Online (Sandbox Code Playgroud)

然后你也可以这样映射(就在vimrc中的函数声明下):

com -range=% -nargs=0 Test :<line1>,<line2>call Test()
Run Code Online (Sandbox Code Playgroud)

所以你可以这样调用函数:

:'<,'>Test
Run Code Online (Sandbox Code Playgroud)

注意: :<','>是范围选择器,为了生成它们只需在可视模式下选择相关的行然后进入命令模式(按冒号键)

  • 对我来说,它产生了这个:http://pastebin.com/8XuqTr1K(每行末尾的«\»).我正在使用来自Gentoo存储库和zsh的pastebin-0.6.1. (2认同)
  • 好的,要添加另一个问题:你知道如何通过这个脚本将vim系统命令行上显示的http链接复制到系统缓冲区吗?(即:"*y) (2认同)

ZyX*_*ZyX 5

也许你应该使用类似的东西

:echo system('echo '.shellescape(@").' | YourCommand')
Run Code Online (Sandbox Code Playgroud)

从一些 vim-7.4 版本开始最好使用

:echo system('YourCommand', getreg('"', 1, 1))
Run Code Online (Sandbox Code Playgroud)

. 如果 NUL 字节存在于文件中,这基本上是保持 NUL 字节不变的唯一方法。@"以一种或另一种方式传递会将 NUL 字节转换为 NL(换行符)。