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

我想将选定的文本输出到shell命令,并在vim info /命令行上从shell命令接收单行输出?

我真正想做的事情:将选定的文本传输到一个pastebin-type shell命令,我想要接收shell cmd的输出(这是到pastebin的http链接)。 这可能吗?

我会这样做:

把这个函数放在你的vimrc中:

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

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

 :'<,'>call Test() 

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

 com -range=% -nargs=0 Test :<line1>,<line2>call Test() 

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

 :'<,'>Test 

注意: :<','>是区域select器,为了产生它们,只需在视觉模式中select相应的行,然后进入命令模式(按冒号键)

对于多行版本,您可以在select文本后执行此操作:

 :'<,'>:w !command<CR> 

您可以将其映射到如下简单的可视化模式快捷方式:

 xnoremap <leader>c <esc>:'<,'>:w !command<CR> 

在可视模式下击打前导键+ c,将选定的文本发送到命令的stdin。 该命令的标准输出将打印在vim的状态栏下方。

CoffeeScript的真实世界示例:

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

只需使用视线selectshift-v来突出显示线条即可。 并input你想要发送命令的命令。 结果输出将会replace您select的文本。

当你键入你的命令时,它会显示在底部,如下所示:

 :'<,'>!somecmd 

“<,”>表示您已经可视化select的范围将被传递给在!

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

 :echo system('echo '.shellescape(@").' | YourCommand') 

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

 :echo system('YourCommand', getreg('"', 1, 1)) 

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

另一个答案:

 function Pastebin() range let savedreg=@" silent execute a:firstline.",".a:lastline."yank" python import vim, subprocess python p=subprocess.Popen(["pastebin"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) python p.stdin.write(vim.eval('@"')) let @"=savedreg python p.stdin.close() python retstatus=p.poll() python print p.stdout.read() endfunction 

需要python支持。 像matias的function一样使用它。

@matias的解决scheme对我来说工作不好,因为它似乎shellescape将追加\到每一行。

所以我用sed来完成这个工作,它工作得很好!

 "dump selected lines function! DumpLines() range echo system('sed -n '.a:firstline.','.a:lastline.'p '.expand('%')) endfunction com! -range=% -nargs=0 Dump :<line1>,<line2>call DumpLines()