我有一系列vim命令将所选块写入临时文件,在该文件上运行函数(knitcite),然后读入另一个文件:
w! ~/.vbuf <CR>
!knitcite ~/.vbuf ~/.vbuf <CR>
r ~/.vbuf <CR>
如果我在运行第一个命令之前在可视模式下选择了一个文本块,它就会变为
:'<,'>w! ~/.vbuf <CR>
根据需要将所选内容传递给文件。我可以把它放到我的.vimrc中的一个简单的vim函数中,但是无法弄清楚如何将视觉选择的内容传递给函数。如果这是一个命令而不是三个命令,我可以使用可视化地图执行此操作,但不确定如何使用三个命令执行此操作。类似的东西:
command knitcite call Knitcite()
func! Knitcite()
exec "w! ~/.vbuf <CR>"
exec "!knitcite ~/.vbuf ~/.vbuf <CR> "
exec "r ~/.vbuf <CR>"
func
但是这不会从可视块传入任何数据。我想我需要给我的Knitcite函数一个参数,但无法弄清楚它会是什么。 (似乎这可能与this SO question有关,但我无法弄清楚如何从这个答案中推广出来。)
答案 0 :(得分:3)
最简单的方法是使用过滤器:
:'<,'>!knitcite
如果knitcite
在过滤器模式下不起作用(通常使用-
将stdin表示为文件名,则可以应用其他选项)您可以将其包装在shell脚本中:
#!/bin/bash
tmpname="/tmp/$(basename "$0").tmp$RANDOM"
trap "rm -f '$tmpname'" ERR INT EXIT
knitcite <(cat) "$tmpname"
cat "$tmpname"
否则,您似乎想要用输出替换视觉选择:
:'<,'>w! ~/.vbuf
:'<,'>d _
:silent! !knitcite ~/.vbuf ~/.vbuf.out
:'<-1r ~/.vbuf.out
注意
"_
)和:delete
命令以避免破坏任何寄存器