現在のvimバッファの内容をstdoutに書き込む機会はありますか?
Stdinを介して渡されたコンテンツをvimを使用して編集したいのですが、変更されたコンテンツを取得するための一時ファイルは必要ありません(Linux/Unixの場合)。
終了または保存に作用するプラグイン/スクリプトがバッファコンテンツをstdoutに置く可能性はありますか?
おもう :w !tee
は完全に機能します、
Linux/Unixを使用しているので、試してみるのもいいかもしれません moreutils 。 vipe
から読み取るstdin
というコマンドを提供し、$EDITOR
のテキストを編集して、変更したテキストをstdout
に出力します。
したがって、エディターをVimに設定してください。
export EDITOR=vim
そして、次の例を試すことができます。
cat /etc/fstab | vipe
cut -d' ' -f2 /etc/mtab | vipe | less
Stdinからの読み取り:
echo "hey" | vim -
あなたが:w
ファイル名を指定する必要があります。
vim
をEDITOR
として使用するプログラム(crontab -e
ファイル名を渡して、ユーザーが:x
そしてファイル名について心配する必要はありません。
[〜#〜]編集[〜#〜]
次のようなこともできます。
mkfifo /tmp/some_pipe
echo "hey" > /tmp/some_pipe ; cat /tmp/some_pipe
そして別のプロセス(または端末)から
vim /tmp/some_pipe
パイプへの書き込みは、パイプから何かが読み取られるまでブロックされ、読み取りは、何かがパイプに書き込まれるまでブロックされるため、通常のファイルを使用する方が安全な場合があることに注意してください。
バッファをシェルの標準出力に出力するには、vim
をExモードで開始する必要があります。そうしないと、独自のウィンドウで「通常の」方法が開き、終了時に出力バッファがすべてクリアされます。
最も簡単な実例は次のとおりです。
$ echo foo | vim -es '+%print' '+:q!' /dev/stdin
foo
余分な迷惑なメッセージを防ぐために、標準入力への特別なファイル記述子を指定する必要があります(/dev/stdin
)。
そして、ここにいくつかの文字列解析の例があります:
$ echo This is example. | vim -es '+s/example/test/g' '+%print' '+:q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+:q!'
Vim: Reading from stdin...
This is test.
vi -e
と同等のex
を使用した簡単な例を次に示します。
ex -s +%p -cq /etc/hosts
関連:
:print
を使用すると、特にvimが-E
オプションと-s
オプションの両方で実行されている場合、stdoutに書き込まれます。これにより、非対話型でサイレントに実行されます。 :h -E
および:h -s-ex
を参照してください。
The output of these commands is displayed (to stdout):
:print
:list
:number
:set to display option values."
:%print
を使用して、現在のバッファ全体を出力します。
次のようなものを試してください:
{ FROMCMD | vim - 8>&1 >&9 | tac | tac | TOCMD; } 9>&1
編集が終了したら、「:w!cat>&8」を使用します
'タック| tac 'は、vimが完全に実行されるまで、TOCMDがデータを受信しないようにします。これは、vimの実行中に混乱しないように、TOCMDが端末に書き込む場合にのみ役立ちます。
TOCMD(または端末操作を行う他のプログラム)として「less」を実行すると、データを遅延させてもプロセスが「同時に」開始され、端末にアクセスする可能性があるため、期待どおりに機能しないことに注意してください。同時に。
pipe.vim を使用することもできます。一時ファイルを使用しますが、少なくとも独自のスクリプトでそれについて心配する必要はありません。
質問の2番目の部分では、vimで-s
コマンドラインオプションを使用して、:w
を他の何か(:w !tee
など)に再マップします。
vimは、次の例のように、stdinとstdoutの明示的な名前を使用してフル機能のフィルターとしてパイプで使用できます。
echo xxx |
vim \
-esnN -i NONE \
+'1 s /x/y/g | 1 s /^/Hallo / | x! /dev/stdout' \
/dev/stdin |
cat -n
/dev/stdin
を-
で省略しても、-v
フラグを使用しなくても機能しません。
Ex-mode(p)rintコマンドを使用して、標準入力する行のセットを印刷できます。
すべての行を印刷します。
:1,$p
また、すべての行を出力します(%は範囲1、$の省略形です)
:%p
4〜10行目を印刷:
:4,10p
fOOを含む次の行を印刷します
/FOO/ p
fOOを含むすべての行を印刷します
g/FOO/ p