web-dev-qa-db-ja.com

vi内のbashコマンド

Vi内でbashコマンドを入力してstdoutを取得することは可能ですか?

シェルで何かを調べたいからといって、viを閉じて再度開くのは面倒なことがよくあります。

33
harp

はい。たとえば、lsを実行する場合は、次のことを試してください。

:!ls

シェルを生成するには、

:Shell

45
daisy

私はctrl+zを使用してviをスリープさせ、シェルで必要なものを実行し、次にfgを使用してviを再開します。あなたの質問に対する正確な答えではありませんが、私はそれが非常に速い作業方法だと思います。

Viをバックグラウンドで開いていることを忘れた場合(これは忙しいときに発生する可能性があります)、ctrl+dを使用してシェルからログアウトしようとすると、バックグラウンドジョブが実行されていることを警告され、それらを閉じるか、もう一度ctrl + dを押してログアウトします。また、同じファイルを2回開こうとすると、回復の警告が表示されるので、aを押して中止し、fgを実行してviに戻ることができます。

12
Rqomey

「標準出力を取得する」と述べたので、次のことができることに注意してください。

:r! command

コマンドの出力がファイルに追加されます、または

:<range>!command

コマンドを使用して範囲のコンテンツをフィルタリングするには[e.g. :1,$!wc]

11
Random832

私の好きなイディオムは

!!command

これは略記です

:.!command

コマンドを通じて現在の行をパイプ処理し、出力をファイルに挿入します。私の最も一般的なケースは、viでコマンドを編集して実行することです:

!!sh

または

!<motion>command

など(例)

!apsh

現在の段落全体をシェルで実行します。

5
Liudvikas Bukys

コロンと感嘆符を使用すると、シェルパスとシェルスクリプトで任意のコマンドを実行できます。コマンドは、vi/vimプログラムを実行しているユーザーとその環境を使用して実行されることに注意してください。

:!<command>

Viは、実行時に有効だった環境を使用するため、親コマンドにあるのと同じパスを使用します。一部のシェルはパス内のプログラムのキャッシュを保持し、viはこのキャッシュで動作しない可能性があります(使用するシェルとそのバージョンによって異なります)。同じ名前の1つのバイナリよりも。

4
Didi Kohen

たとえば、コマンドモードで:!ls -lhと入力すると、コマンドの出力を表示できます。

コマンドの出力を編集中のファイルに挿入する場合は、rを追加するだけです。たとえば、:r!which Perlなどです。

4
Eliot Ball

!を使用するのは明らかに正しい答えですが、頻繁に切り替えを繰り返す場合は、screenやtmuxなども役立ちます。

1
Ryan A.

これは私の.vimrcにあります。しばらく前にスタックオーバーフローで見つかりました:

" Executes the current line in a bash Shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
0
Clayton Stanley

Linuxでは、2つのターミナルコマンドラインウィンドウを開いてviを実行することで、これを簡単に回避できます。

0
Harry Weston