3

vim ( :help :!) からシステム コマンドを実行したいのですが、文字列変数の内容をそのコマンドの stdin として渡したいと考えています。

現在のバッファから stdin として行を渡すことができることは既に知っています(「参考文献」を参照:help :w_c)。しかし、現在のバッファーを変更したくありません。また、新しいバッファーを作成したくありません。

文字列を一時ファイルに書き込み、そのファイルを入力としてパイプして削除できることはわかっています。現在、それが私のアプリケーションで知っている最良のソリューションです。ただし、最初からファイルを作成しないようにする方がクリーンです。

それはできますか?

4

3 に答える 3

2

後世のために、ハッキング中に私が見つけた別の答えを次に示します。

@Kentの答えは、stdinをコマンドに渡す正規のvimの方法のように見えます。一時ファイルの管理から解放されます。しかし、(何らかの理由で) ファイルを作成するオーバーヘッドをまったく避けたい場合はどうすればよいでしょうか? これを行う方法は次のとおりです。

基本形は

echo your_string | your_command

もちろん、詳細を正しく取得するとエラーが発生しやすくなるため、関数でラップすることをお勧めします。

function! RunCommandWithStdin(cmd, stdin_lines)
  let l:stdin = shellescape(join(a:stdin_lines, "\\n"), 1)
  execute '!echo -e' l:stdin '|' a:cmd
endfunction

以下を使用したクイックサニティチェックpatch:

:!echo foo > bar
:!cat bar
foo
:call RunCommandWithStdin('patch bar', ['@@ -1 +1 @@', '-foo', '+~!@#$%^&*()'])
:!cat bar
~!@#$%^&*()

これは特殊文字を正しく処理しているように見えることに注意してください。

欠点は、 を使用しているechoため、おそらく *nix-alikes に制限されていることです。しかたがない。

于 2013-08-25T20:34:01.083 に答える