後世のために、ハッキング中に私が見つけた別の答えを次に示します。
@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 に制限されていることです。しかたがない。