2012-02-05 12 views
8

Vimでは、シェルコマンドの出力を読むのに最も便利な(移植性があり高速な)方法は何ですか?この出力はバイナリであり、したがってnullを含み、重要でない末尾の改行を持ちません。現在表示されているソリューション:シェルコマンドの出力を読み取る最良の方法

  1. system()を使用してください。問題:NULLで動作しません。
  2. :read !を使用してください。問題:後続の改行を保存せず、出力形式(dos/unix/mac)をスマートに検出しようとします。
  3. !を一時ファイルにリダイレクトし、次にreadfile(, "b")を使用して読み取ります。問題:fsの2つの呼び出し、shellredirオプションはデフォルトでstderrをリダイレクトします。これは移植性が低いはずです('shellredir'は有効な値に設定される可能性が高いのでここで言及します)。
  4. system()を使用し、フィルタ出力をxxdにします。問題:非常に遅く、可搬性がほとんどありません(パイプには'shellredir'に相当しません)。

他のアイデアはありますか?

答えて

4

テキストエディタを使用しています。 NUL、後続のEOL、(おそらく)競合するエンコーディングを気にする人は、とにかく16進エディタを使用する必要がありますか?

:se binary 

あなたが欠場するように見える一つの素敵なオプションが式は挿入を登録し、挿入モードであると

私は私の動作の制御のこの量が必要な場合は、私が実際にXXDルートを使用し、

クロム=system('ls -l')入力し

これは、文字エンコードビジネスについてよりスマートに、またはより邪魔にならないかもしれませんが、十分に重要であれば試すことができます。

それとも、効率的popen

ラフなアイデアを使用するPerlやPythonのサポートを使用することができますが:

:perl open(F, "ls /tmp/ |"); my @lines = (<F>); $curbuf->Append(0, @lines) 
+0

あなたは ' =システム( 'printfの '' \ X00' '')'を試すことができます。 ':%!printf '\ x00' 'はバッファに'^@ 'と見える単一のNULLを入れます(大きな問題:'%%printf' \ x00 \ r \ n ''は何も出力しません)同じ)。 – ZyX

+0

ここで問題になるのは、 "%!"と "put command output to file"によって達成できる "read command into buffer"の2つの機能を持ちたくないということです。これ以上は必要ないとは言えません。この場合、readfile()とのアナログは最も柔軟な解決策です。 – ZyX

+0

ちょうどperl/pythonサポートの使用を考えました。スターターの答えを見てください – sehe

関連する問題