我想将所选文本导入到shell命令中,并在vim信息/命令行上接收这个shell命令的一行输出?
我真正想做的是:将所选文本传输到pastebin类型的shell命令中,并希望接收shell cmd的输出(即pastebin的http链接)。这可能吗?
我想将所选文本导入到shell命令中,并在vim信息/命令行上接收这个shell命令的一行输出?
我真正想做的是:将所选文本传输到pastebin类型的shell命令中,并希望接收shell cmd的输出(即pastebin的http链接)。这可能吗?
对于多行版本,选择文本后可以执行以下操作:
:'<,'>:w !command<CR>
请查看官方的Vim文档,网址为:help :w_c
.
你可以像这样将它映射到简单的可视模式快捷方式:
xnoremap <leader>c <esc>:'<,'>:w !command<CR>
在可视模式下按下<leader key>+c,将选择的文本发送到命令的标准输入(stdin)。命令的标准输出(stdout)将会打印在vim状态栏下面。
CoffeeScript的实际示例:
https://github.com/epeli/vimconfig/commit/4047839c4e1c294ec7e15682f68563a0dbf0ee6d
:w
的语法和作用方式。它是正常的“写入”命令吗?第二个冒号有什么作用?你能解释一下吗?谢谢! - schoettlxnoremap <expr> <Leader>c "\<Esc>:'<,'>:w !" . getbufvar('%', 'run_command', &filetype) . "\<CR>"
。这将使用缓冲区的 filetype
作为命令,适用于许多语言(如 ruby
、python
等)。您仍然可以通过设置 b:run_command
来覆盖此设置,这对于嵌入在 Markdown 文件中的代码非常有用。 - Martin Tournoij:help :w
下找到相关内容,具体地说是:help :w_c
。 - Mihai Alexandru Bîrsan只需使用可视化行选择Shift+V突出显示代码行,然后按:!并键入您要发送到命令的命令。生成的输出将替换您选择的文本。
输入您的命令时,它将出现在底部:
:'<,'>!somecmd
'<,'>是指您在视觉上选择的范围将被传递到感叹号后面指定的命令中。
sh
设置为实际的shell命令。例如::'<,'>!sh
- Salamifunction 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
注意::<','>
是区间选择器,要生成它们,请在可视模式下选择相关行,然后进入命令模式(按冒号键)。
echo system('pbcopy', join(getline(a:firstline, a:lastline), "\n"))
。 - Sam Jacobson:echo system('echo '.shellescape(@").' | YourCommand')
从vim-7.4版本开始,最好使用
:echo system('YourCommand', getreg('"', 1, 1))
这基本上是保持文件中的NUL字节不受影响的唯一方法。以任何一种方式传递@"
都会将NUL字节转换为NL(换行符)。
E481:不允许范围
。 - davr:call system('YourCommand', @")
。映射将为您执行必要的复制操作。总体来说,它看起来像这样:map <silent> <Leader>y "9y:call system('YourCommand', @")<CR>
主要的重点是system()
函数接受第二个参数,该参数被写入程序的标准输入中,因此避免了所有转义问题。 - Tim Siegel@"
不是最好的选择。请看更新后的答案。 - ZyX@matias的解决方案对我来说不太适用,因为似乎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()
:
!
,并粘贴你刚才复制的内容,可以使用<Ctrl> r "
来粘贴y : ! <Ctrl> r "
另一个答案:
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的函数一样使用它。
STDIN
提供给shell命令相关的问题:用shell命令输出替换选定的原始文本和在vim中使用管道与整个缓冲区交互。 - user1129682