2012-10-05 129 views
3

我有一系列vim命令將選定的塊寫入臨時文件,在該文件上運行函數(knitcite),然後在另一個文件中讀取:vim運行選擇命令(或功能)

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但我無法弄清楚如何從這個答案概括。)

回答

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命令,以避免重挫任何寄存器
+0

感謝您提供兩個直接答案的問題和更好的方法通過用包裝的建議一個shell腳本。太棒了。 – cboettig

+0

@cboettig謝謝。注意我只是從信號陷阱中刪除了多餘的引用 – sehe