用命令输出替换可视选择

Ben*_*fez 3 vim

我想用选择的结果通过管道传递到命令中来替换一行的一部分。

例如:

echo "hello $(echo "world" | base64)" | vim -
Run Code Online (Sandbox Code Playgroud)

这将hello d29ybGQK在其中打开一个缓冲区。现在按下wvw以直观地选择d29ybGQK

然后,我尝试:!base64 -d并希望该缓冲区包含hello world,但没有发生。确实,整行都通过管道传递到命令中,并且替换了整行。

是否可以仅替换视觉选择,而仅将该选择通过管道传递到命令中?

我也尝试过,c<c-r>=system('base64 -d')但是没有将视觉选择发送到命令的标准输入。

sid*_*yll 6

! 始终使用逐行过滤。您的解决方案 c和表达式寄存器是解决此问题的极好方法。您只忘记将输入传递给system(),这是它的第二个可选参数。

由于您只是更改了选定的文本,因此它将"自动进入寄存器。您需要做的就是通过以下方式将其收回并传递给系统getreg()

c<C-R>=system('base64 -D', getreg('"'))
Run Code Online (Sandbox Code Playgroud)

请注意,这base64可能会在末尾显示换行符。如果要删除它,可以将整个内容包装trim()在Vim 8中的一个新函数中,或使用[:-2]

c<C-R>=trim(system('base64 -D', getreg('"')))
c<C-R>=system('base64 -D', getreg('"'))[:-2]
Run Code Online (Sandbox Code Playgroud)

这是的简写[0:-2],表示在结果字符串中抓取从字符0到倒数第二的所有内容。

如果经常使用,请考虑创建视觉地图:

vnoremap <leader>d c<C-R>=system('base64 -D', getreg('"'))[:-2]<CR>
Run Code Online (Sandbox Code Playgroud)

  • 哇,太好了,谢谢。正是我想要的!读者注意:-D似乎是base64的BSD选项(至少是我在Mac上拥有的选项),-d似乎是GNU选项(至少是我在工作笔记本电脑上拥有的选项/服务器)。 (2认同)