vim在选择时运行一系列命令(或函数)

时间:2012-10-05 20:05:26

标签: vim

我有一系列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有关,但我无法弄清楚如何从这个答案中推广出来。)

1 个答案:

答案 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

注意

  1. 为输出使用单独的临时文件:否则,在大多数平台上可能会出现问题,输出文件的截断可能会在读取输入之前发生!
  2. 使用黑洞寄存器"_)和:delete命令以避免破坏任何寄存器