4

選択したブロックを一時ファイルに書き込み、そのファイルで関数 (knitcite) を実行してから、別のファイルを読み取る一連の vim コマンドがあります。

w! ~/.vbuf <CR> 
!knitcite ~/.vbuf ~/.vbuf <CR> 
r ~/.vbuf <CR>

最初のコマンドを実行する前にビジュアル モードでテキスト ブロックを選択すると、

:'<,'>w! ~/.vbuf <CR>

必要に応じて、選択した内容をファイルに渡します。これを.vimrcの単純なvim関数に入れることができますが、視覚的な選択の内容を関数に渡す方法がわかりません。これが 3 つのコマンドではなく 1 つのコマンドであれば、ビジュアル マップでこれを行うことができますが、3 つのコマンドで行う方法がわかりません。何かのようなもの:

command knitcite call Knitcite()
func! Knitcite()  
exec "w! ~/.vbuf <CR>"
exec "!knitcite ~/.vbuf ~/.vbuf <CR> "
exec "r ~/.vbuf <CR>"
func

ただし、これはビジュアル ブロックから渡されたデータを取得しません。Knitcite 関数に引数を与える必要があると思いますが、それが何であるかわかりません。(これはこの SO の質問に関連しているようですが、その回答から一般化する方法がわかりませんでした。)

4

1 に答える 1

3

最も簡単な方法は、フィルターとして使用することです。

:'<,'>!knitcite

knitciteフィルタ モードで動作しない場合(多くの場合-、ファイル名として stdin を示すために使用され、他のオプションが適用される場合があります)、シェル スクリプトでラップできます。

#!/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 に答える