Vi内でbashコマンドを入力してstdoutを取得することは可能ですか?
シェルで何かを調べたいからといって、viを閉じて再度開くのは面倒なことがよくあります。
はい。たとえば、ls
を実行する場合は、次のことを試してください。
:!ls
シェルを生成するには、
:Shell
私はctrl+z
を使用してviをスリープさせ、シェルで必要なものを実行し、次にfg
を使用してviを再開します。あなたの質問に対する正確な答えではありませんが、私はそれが非常に速い作業方法だと思います。
Viをバックグラウンドで開いていることを忘れた場合(これは忙しいときに発生する可能性があります)、ctrl+d
を使用してシェルからログアウトしようとすると、バックグラウンドジョブが実行されていることを警告され、それらを閉じるか、もう一度ctrl + dを押してログアウトします。また、同じファイルを2回開こうとすると、回復の警告が表示されるので、a
を押して中止し、fgを実行してviに戻ることができます。
「標準出力を取得する」と述べたので、次のことができることに注意してください。
:r! command
コマンドの出力がファイルに追加されます、または
:<range>!command
コマンドを使用して範囲のコンテンツをフィルタリングするには[e.g. :1,$!wc
]
私の好きなイディオムは
!!command
これは略記です
:.!command
コマンドを通じて現在の行をパイプ処理し、出力をファイルに挿入します。私の最も一般的なケースは、viでコマンドを編集して実行することです:
!!sh
または
!<motion>command
など(例)
!apsh
現在の段落全体をシェルで実行します。
コロンと感嘆符を使用すると、シェルパスとシェルスクリプトで任意のコマンドを実行できます。コマンドは、vi/vimプログラムを実行しているユーザーとその環境を使用して実行されることに注意してください。
:!<command>
Viは、実行時に有効だった環境を使用するため、親コマンドにあるのと同じパスを使用します。一部のシェルはパス内のプログラムのキャッシュを保持し、viはこのキャッシュで動作しない可能性があります(使用するシェルとそのバージョンによって異なります)。同じ名前の1つのバイナリよりも。
たとえば、コマンドモードで:!ls -lh
と入力すると、コマンドの出力を表示できます。
コマンドの出力を編集中のファイルに挿入する場合は、r
を追加するだけです。たとえば、:r!which Perl
などです。
!
を使用するのは明らかに正しい答えですが、頻繁に切り替えを繰り返す場合は、screenやtmuxなども役立ちます。
これは私の.vimrcにあります。しばらく前にスタックオーバーフローで見つかりました:
" Executes the current line in a bash Shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Linuxでは、2つのターミナルコマンドラインウィンドウを開いてviを実行することで、これを簡単に回避できます。