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()