我想用选择的结果通过管道传递到命令中来替换一行的一部分。
例如:
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')
但是没有将视觉选择发送到命令的标准输入。
!
始终使用逐行过滤。您的解决方案 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)