4

我有一系列 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有关,但我无法弄清楚如何从该答案中概括。)

4

1 回答 1

3

最简单的做法是用作过滤器:

:'<,'>!knitcite

如果knitcite在过滤器模式下不起作用(通常用于-将标准输入表示为文件名,其他选项可能适用),您可以将其包装在 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以避免破坏任何寄存器
于 2012-10-05T20:12:07.220 回答