web-dev-qa-db-ja.com

バッファコンテンツをstdoutに書き込む方法は?

現在のvimバッファの内容をstdoutに書き込む機会はありますか?

Stdinを介して渡されたコンテンツをvimを使用して編集したいのですが、変更されたコンテンツを取得するための一時ファイルは必要ありません(Linux/Unixの場合)。

終了または保存に作用するプラグイン/スクリプトがバッファコンテンツをstdoutに置く可能性はありますか?

31
hooblei

おもう :w !teeは完全に機能します、

21
weynhamz

Linux/Unixを使用しているので、試してみるのもいいかもしれません moreutilsvipeから読み取るstdinというコマンドを提供し、$EDITORのテキストを編集して、変更したテキストをstdoutに出力します。

したがって、エディターをVimに設定してください。

export EDITOR=vim

そして、次の例を試すことができます。

cat /etc/fstab | vipe
cut -d' ' -f2 /etc/mtab | vipe | less
19
jabirali

Stdinからの読み取り:

echo "hey" | vim  -

あなたが:wファイル名を指定する必要があります。

vimEDITORとして使用するプログラム(crontab -eファイル名を渡して、ユーザーが:xそしてファイル名について心配する必要はありません。

[〜#〜]編集[〜#〜]

次のようなこともできます。

mkfifo /tmp/some_pipe
echo "hey" > /tmp/some_pipe ; cat /tmp/some_pipe

そして別のプロセス(または端末)から

vim /tmp/some_pipe

パイプへの書き込みは、パイプから何かが読み取られるまでブロックされ、読み取りは、何かがパイプに書き込まれるまでブロックされるため、通常のファイルを使用する方が安全な場合があることに注意してください。

7
miedwar

バッファをシェルの標準出力に出力するには、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

関連:

5
kenorb

: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を使用して、現在のバッファ全体を出力します。

2
jmckernon

次のようなものを試してください:

{ FROMCMD | vim - 8>&1 >&9 | tac | tac | TOCMD; } 9>&1

編集が終了したら、「:w!cat>&8」を使用します

'タック| tac 'は、vimが完全に実行されるまで、TOCMDがデータを受信しないようにします。これは、vimの実行中に混乱しないように、TOCMDが端末に書き込む場合にのみ役立ちます。

TOCMD(または端末操作を行う他のプログラム)として「less」を実行すると、データを遅延させてもプロセスが「同時に」開始され、端末にアクセスする可能性があるため、期待どおりに機能しないことに注意してください。同時に。

2
bingo

pipe.vim を使用することもできます。一時ファイルを使用しますが、少なくとも独自のスクリプトでそれについて心配する必要はありません。

質問の2番目の部分では、vimで-sコマンドラインオプションを使用して、:wを他の何か(:w !teeなど)に再マップします。

1
studgeek

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フラグを使用しなくても機能しません。

1
xyxyber

Ex-mode(p)rintコマンドを使用して、標準入力する行のセットを印刷できます。

すべての行を印刷します。

:1,$p

また、すべての行を出力します(%は範囲1、$の省略形です)

:%p

4〜10行目を印刷:

:4,10p

fOOを含む次の行を印刷します

/FOO/ p

fOOを含むすべての行を印刷します

g/FOO/ p
0
Ray