Vimウィンドウでインタラクティブシェルを発行できますか?


16

外部コマンドを実行できること、:!または:r!オプションでその出力をテキストに挿入できることを知っています。実行することもでき:!sh、終了するまで生存するシェルを生成しますが、シェルがアクティブな間、Vimは「スリープ」状態になり、アクセスできなくなります。しばらくVimに戻りたい場合は、シェルを終了し、新しいシェルを作成する必要があります-あまり便利ではありません。

私はVimを懸濁させて、反対の端にシェルにアクセスすることができ^Z、スルーVimの仕事を管理しbgfgそしてjobs。これは理にかなっていますが、長期的には非常に面倒です。使用Screen可能であれば(使用できない場合が多い)、ウィンドウマネージャーの複数のウィンドウを開きます(そして、sshを使用して各ホストから順にホストをターゲットにし、リモートホストでvimとシェルの両方を使用します)。

Vimでシェルセッションを開いて、たとえば(内部)ウィンドウの1つに保持したり、シェルセッションに切り替えたり元に戻したりすることが許可されている場合、これが最も適切です。このようなことは可能ですか?


1
だから、基本的には:split、ファイルを別のウィンドウに保持したまま、シェルを開きたいですか?... tmuxのか、スクリーンのための仕事のようなこの音は私に...
マーティンTournoij

1
@Carpetsmoker:リモートシステムにインストールされているものを制御できないことがよくあります。Vimは常に存在しますが、多くの場合、どちらも制御できません。
SF。

Neovimへの切り替えを検討してください。現在、非常にうまく機能し、vimバッファーで開くことができるターミナルエミュレーターが組み込まれています。
ザック

回答:


16

これを可能にするいくつかのvimプラグインがあります。私はConqueGithub)を使用しています。

あなたのプラグインディレクトリにそれを置いた後、あなたがしなければならないことはすべてです:

:ConqueTermSplit bash

そして、vimにインタラクティブなbashシェルがあります。その後、通常のvimジェスチャを使用して、ウィンドウ内で必要な他の操作を実行できます。

また、他のプラグインはvimshellです。


1
プラグインなしでこのようなことをする方法はありませんか?
SF。

3
@SFを参照してください:help shell-window。(短い答え:いいえ)
ムー

3

VIMでは、これを行うためのプラグインはそれほど素晴らしいものではないと思いますが、IMO vimshellが最も近くなります。ただし、それは2つの部分の問題であることを理解する必要があります。

  1. VIMはこのようなことができるように設計されていませんでした。特に面倒なのは、長時間実行されているタスクを実行し、VIMをブロックせずに非同期で通信できることです。この場合、シェル自体だけでなく、シェルプロセス内で実行する可能性のある他のタスクも含まれます。
  2. VIMのモーダル哲学は、シェルと対話する方法ではそれほどうまく機能しません。シェルでは現在の行のみが編集可能ですが、シェルで履歴の古いテキストをスクロールして表示することはできますが、編集することはできません。これはVIMの哲学にはまったく適合しません。ESCを押して通常モードに戻ると、ユーザーが上記の履歴の一部に戻って編集することを禁止することは非常に難しくなります。

私の意見では、この点ではるかにうまく機能する2つのアプローチがあります。

  1. TMUX / Screenを使用して、vimとシェルの両方を持つ端末ウィンドウを多重化します。このように、2つはきちんと分離されていますが、非常に少ない労力で両方を表示でき、お互いのフローと競合することなく2つの可能性を最大限に活用できます。
  2. tpope / vim-dispatchなどのプラグインを使用すると、1回限りのシェルコマンドを簡単に起動し、実際のターミナルシェルでバックグラウンドで非同期に実行し、完了すると結果をvimに戻すことができます。これはまた、2つの間で同じレベルの分離を提供するため、2人はお互いのつま先を踏むことなく、最大限の能力を発揮することができます。

NeoVIMの主要な目標の1つがジョブを非同期に実行できるようになるため、NeoVIMがこの側面に変化をもたらす可能性が高いことを付け加えます。しかし、それまではこれが最高だと思う。


3

では:help shell-window、私たちは、ウィンドウ内のシェルコマンドを実行について読むことができます。

Vim内のウィンドウでシェルを実行する可能性について質問がありました。

答え:できません!

これを含めると、Vimに多くのコードが追加されます。これは、これを行わない正当な理由です。結局のところ、 Vimはエディターであり、非編集タスクを実行することは想定されていません。ただし、このようなものを取得するには、「splitvt」プログラムで端末画面または表示ウィンドウを分割してみてください。

別の方法は、BSD Unixシステムにある「window」コマンドで、複数のオーバーラップウィンドウをサポートします。または「スクリーン」プログラム。

ただし、使用できるソリューションはほとんどありません。

  • screenその種のもののために特別に設計された使用、例えば:

    • Ctrl+ aS現在のウィンドウを水平方向に分割する
    • Ctrl+ aTabウィンドウを切り替える
    • Ctrl+ aX現在のリージョンを削除する
    • Ctrl+ aQ1つを除くすべての領域を削除する

    詳細は、stackoverflow SEのGNU Screen Survival Guideをご覧ください。

    または:詳細については、GNU Screen Splittingスクリーンクイックリファレンス参照してください。

  • VIM-Shell-サードパーティのパッチ

    VIMシェルは、分割ウィンドウを備えたVIMの拡張機能であり、このパッチにより、これらのウィンドウでシェルを起動できます。POSIXシステムでのみ使用可能です

  • vterm -vim内のターミナルエミュレーター。

    vtermの目標は、vim内でunixターミナルのクローンを提供することです。これは、依存関係なしですぐに動作します。

  • Vimux -vimからtmuxと簡単に対話できます。

    tmlimeに入力を送信できるプラグインtslime.vimに触発されたvimuxは、vimからtmuxとのやり取りを簡単に行えるようにするものです。

  • すでに述べた:Conque

関連:vim内で端末を実行する方法は?stackoverflowで


スプリットを取り除くには?? :-/
0xc0de

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