標準入力からコンテンツを編集する方法は?


15

まだファイルを持たずにコマンドラインから動的に生成されたvimのコンテンツを編集したいと思います。

例:

$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin

しかし、エラーで失敗しています:

Vim:警告:入力は端末からではありません

Vim:入力の読み取りエラー、終了...

それを達成することは可能ですか?


:help stdin...組み込みのドキュメントについて質問することで、どれだけ速く答えを見つけることができるかは驚くべきことです。
ダッシュトムバン

回答:


23

-コマンドラインでファイル名の代わりに使用する必要があります。

echo This is example. | vim -

上記のコマンドは、標準入力から読み取られたテキストで満たされた名前のないバッファを開きます。


7
-for stdinの使用は、コマンドラインツールのほぼ標準です。
マーティントゥルノイ

6

これは主にbashとについてのおもしろいメモreadlineですが、EDITOR環境変数をに設定するとvimCtrl+ x+ eを押すとの現在の行が開きvimます。さらに、Meta(Alt/Opt/Esc)+ Ctrl+と入力するとe、bashは現在のコマンドラインでインプレース展開を実行します。

$ echo $EDITOR # Assuming EDITOR was set

Meta(Alt/Opt/Esc)+ Ctrl+ eになります

$ echo vim # Assuming EDITOR was set

Ctrl+ x+ eになります

1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile

vimを終了すると、vimバッファーの内容がコマンドラインで実行されることに注意してください。

これらの機能は、forループやhereステートメントを必要とするプログラムなど、bashで複数行のコマンドを実行したい場合に非常に役立ち、コマンドライン履歴を後で使用するためにファイルに保存する興味深い方法を提供します。

元の質問に答えるために、次のように書くこともできます。

$ This is an example

そして、Ctrl+ x+ eを押してにロードしvimます。また、あなたが持つことができる、

 $ $(cat /etc/hosts)

そして、やるMeta(Alt/Opt/Esc)+ Ctrl+ eその後、Ctrl+ x+ e1本のライン上のhostsファイルのすべてを入れて、それをアップロードしている、vimしかし、これらの手法の有用性を検討し、いくつかの例から推定することができます-おそらく、これらの機能を最大限に活用がありません(ここに)。

あなたreadlineemacsモードに設定されていると仮定していることに注意してください。readlinevimモードに設定されている場合、次のコマンドを使用して、関連するバインディングを簡単に検出できます。

bind -p

そして探しedit-and-execute-commandまたはshell-expand-line、それぞれバインディングに関連付けされたCtrl+ x+ eMeta(Alt/Opt/Esc)+ Ctrl+ e


emacsの代わりにviキーバインディングを使用するようにbashに指示できます。を使用set -o viしてオンにします。次にv、通常モードでマッピングを使用して、エディターで現在のコマンドを編集できます。
クインシーバウアーズ

1
確かにこれはVIを使用してコマンドライン編集に素晴らしいトリックですが、標準入力からテキストを読み取るために、このメソッドを使用して、少なくとも二つの問題があります:1. shell-expand-line削除改行展開されたテキストおよび2からedit-and-execute-command試しバッファに書き込まれたコマンドを実行するには、 、viを終了するときに、保存されているかどうかに関係なく。
toro2k

うわー、これは素晴らしいです。私は毎日readlineについて新しいことを学んでいるようです
...-Doorknob

2

bashでは、<(command)構文を使用してプロセス置換を使用すると便利です。例:

vim <(echo This is example.)
vim <(cat /etc/hosts)

こちらもご覧ください:


4
これはすべてのシェルで機能しないことに注意してください。私はそれだけでは動作すると思いますbashし、zsh(とないshkshdashfishcshtcsh、など)
マーティンTournoij

@Carpetsmokerはksh88以上で動作するはずです、しかし、はい、プロセス置換はPOSIXではありません。
ムル

4
そして、自分をだまさないように注意してください!この方法でVimを起動すると、Vimのようなファイルのバッファーが開きます/proc/PID/fd/FD。バッファを書き込んで終了しても、Vimは文句を言いませんが、書き込み先のファイルはOSによって削除されます。-ファイル名として開いたバッファを使用すると、関連付けられたファイルがないため、(bangコマンドなどを使用しない限り)Vimを保存せずに終了しようとすると警告が表示されます。
toro2k

1
これは、に一般化されるので便利ですvimdiff <(echo foo) <(echo bar)
wchargin

@ toro2kフォローアップする:next:prev、ストリームを使用して再読み込みしたように見え、何も取得されません。また、プロセスは互いに平行ではないことを言及する価値があります-例えばcat <(sleep 3; echo a) <(echo b)、順番に印刷します-そして、cat書き込みと読み取りをインターリーブしている間vim、外側のフレームを除くすべてを表示する前にファイルを「読み取り終了」します。
ジョンP

-1

新しいVimへのパイプラインを使用する必要がない場合は、Vimの機能を使用して、コマンドの出力を現在のバッファーに取り込むことができます。また、非ファイルバックアップバッファーを使用する(:new存在しないファイルを編集するなど)

:read!cat /etc/hosts コマンドモードでは、現在のカーソル位置の下の現在のバッファに出力が配置されます。

これが空のバッファーで行われたときに残っている空の最初の行を削除する必要があることとは別に、これはうまく機能し、Vimが既に実行されている場合に特に便利です。


1
これは質問にどのように答えますか?
ムル

コマンドの出力を取得し、vimに入れます。
ewatt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.