vi内のbashコマンド


33

viの中にbashコマンドを入力してstdoutを取得することは可能ですか?

シェルで何かを調べたいという理由だけで、viを閉じて再度開くのは面倒です。

回答:


45

はい、たとえば、したい場合lsは試してください:

:!ls

シェルを生成するには、使用します

:shell


素晴らしい、これなしでどうやって生きることができますか?
ハープ

3
実際、私がよくしていることは、何かを編集するときにrootとしてviを実行するのを忘れることです。このコマンドは、私が覚えているよりも多くの時間を費やす書き換えから私を救ってくれました。 :w !sudo tee %
マークD

1
gnuでこれを行う方法があるといいのですがnano
-ixtmixilix

1
そして、:shellを使用した後、どのようにエディターに戻りますか?
VaTo

@VaTo:戻るには、次のように入力します
。exit

12

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

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


1
これは、コマンドラインで実行していることに巻き込まれ、vimをバックグラウンドにしたことを忘れた場合に厄介になります。
エリオットボール

1
はい、それは可能です、私はそれを自分でしました。私にとっては、シェルの恒常性を維持する価値があります。私は考慮にあなたのコメントを取るために私の答えを更新します
Rqomey

1
gnu screenを使用した方が良いと思います。
user606723

1
私は自分でtmuxを使用していますが、速度のために、tmuxまたは画面なしでサーバーにログインする場合は便利です
-Rqomey

11

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

:r! command

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

:<range>!command

コマンドを介してフィルタリングされた範囲のコンテンツを持つ[eg :1,$!wc]


:%!command非常に便利に見える
エリオットボール

私は、行をソートするために、多くの場合、これを使用する[例えば:.,+20 !sort]
ウォルター・A

5

私の好みのイディオムは

!!command

これは略記です

:.!command

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

!!sh

または

!<motion>command

など(たとえば)

!apsh

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


2
!}段落の先頭に配置する必要があることに注意してください!ap。(これがすべてのviにあるのか、それともvimのみにあるのかはわかりません)
ランダム832

4

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

:!<command>

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


4

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

コマンドの出力を編集中のファイルに挿入する場合は、単に追加しrます。たとえば、:r!which perl


1

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


0

これは.vimrcにあります。しばらく前にStack Overflowで見つかりました:

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

0

Linuxでは、2つのターミナルコマンドラインウィンドウを開き、一方を他の作業で同時に実行できるようにしてviを実行することで、簡単にこれを実行できます。

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