Vim内でターミナルを実行するにはどうすればよいですか?


305

私はEmacsに慣れていますが、Vimを試して、どちらが好きかを調べています。

Emacsについて私が気に入っている点の1つは、Emacs内で端末を実行できることです。これはVimの内部で可能ですか?Vimからコマンドを実行できることはわかっていますが、タブ内でターミナルを実行できるようにしたいと思います。



42
である:! <command>あなたが探しているもの?
takeshin 2013

48
Vim 8.0以降:term、新しい分割ウィンドウで新しいターミナルを開くコマンドがあります。機能しない場合vim --version | grep -o .terminalは、この機能が使用可能(+terminal)か使用不可(-terminal)かを確認してください。
Susam Pal

回答:


123

私は間違いなくお勧めします screenこのようなものをします。Vimはシェルではなくテキストエディタです。

Ctrl+AS現在のウィンドウを水平に分割するために使用するか、Ubuntuの画面や他のパッチバージョンでは、Ctrl+A|(パイプ)を使用して垂直に分割できます。次に、Ctrl+ATab(または一部のシステムでは同等に、Ctrl+ACtrl+I入力する方が簡単なもあります)を使用して、ウィンドウを切り替えます。ウィンドウのサイズと配置を変更する他のコマンドがあります。

または、それほど高度でscreenはない使用法は、複数の全画面ウィンドウを開いてそれらを切り替えることです。これは私が通常行っていることで、分割画面機能をときどき使用するだけです。

GNU画面サバイバルガイドあなたは、その使用に慣れていないなら質問は良いヒントがいくつかあります。


7
+1つい最近、スクリーンゴスペルを受け取りました。どうやってそれなしで生きてきたのかしら。

118
画面ではなくtmuxを選択します。
tomaszkubacki

81
もちろん、画面、tmux、またはターミネーターを実行したり、別のウィンドウを開いてalt-tabを実行したり、フットペダルでアクティブ化されたKVMスイッチを使用したりすることもできます。しかし、それが目的ではありません。これらのソリューションはすべて、ターミナルとVIMの間の統合を犠牲にします。そのため、この分野でソリューションを探すのは面倒です。この回答がどのようにして回答であるか、ましてやトップまたは受け入れられた回答であることはわかりません。コンクを試してみようと思います。
ステーブルドッグ2013

33
これはどうですか?投票を取り消し、次の回答に投票する必要があります。これにより、実際に質問に回答します。screenを使用しても、vim内でシェルは実行されません。これは、別のシェルを開始するように誰かに指示するようなものです。そして、「:!」を捨て続けている人のために。彼はすでにコマンドの実行方法を知っていた、それは彼が求めていたものではない... ここの傲慢さはとても厚いので、ナイフで切ることができます。
osirisgothra 2014

6
この回答は、原因新しいVIM 8.1機能にアップデートする必要があるターミナルウィンドウ
アラン・ガリード

232

2011年8月から廃止

Conque ShellGitHubにもあります)をチェックしてください。シェルだけでなく、vim内でインタラクティブなプログラムを実行できます。


21
:ConqueTerm bash <CR>vim <CR>:ConqueTerm bash....再帰的な恐怖!!
keflavich 2012年

1
psihodeliaは正しいようです。--enable-pythoninterpでvimをコンパイルしたところ(cygwinは+ pythonでvimを配布していません)、ConqueTermをインストールした後、#set_buffer_settingsからエラーが発生します。その関数がどこにあるのかを追跡したり、エラーの意味を理解したりできません。メッセージには、無効な引数 "edit ++ enc = utf-8 bash \-\ 2"に関する記述が含まれています。ああ。
ネイトケネディ

47
再帰を理解するには、まず再帰を理解する必要があります。
ステーブルドッグ2013

19
ルカシュNiemier VIMCEPTION @
セバスティアンGrignoli

1
これはもはやサポートされていないようです、誰もが代わりを持っていますか?
dykeag

204

あなたが何を達成しようとしているのか正確にはわかりませんが(Emacsを使用したことがありません)、Vimで次のように入力してコマンドを実行できます。

:! somecommand [ENTER]

そして、いくつかのコマンドを入力したり、シェルでしばらく遊んだりしたい場合は、いつでも使用できます:

:! bash (or your favourite shell) [ENTER]

コマンドまたはシェルが終了Enterすると、エディタウィンドウに戻るために押すオプションが表示されます

Vimは意図的に軽量化されており、Vimペイン/タブ内で本格的なシェルを実行するのと同じように、非エディタータイプの機能を実行できません。そういうことをするために。

通常、Vimとシェル(Bash)を切り替える場合は、CTRL+ Zを押してVimプロセスを一時停止し、シェルで遊んで、Vimに戻りたいときに「fg」と入力します-エディターとシェルは素晴らしく、分離しています。


17
そして、コマンドの出力を現在のバッファにコピーしたい場合::r!dir
サイバーオリベイラ

6
私はEmacsとVimの両方を使用しています(そしてVimでの経験がさらに豊富です)。しかし、多くの場合、同時に2つのビューを操作する方がより適切で簡単です(1つは編集中の内容を確認するため、もう1つはインタラクティブシェル内で操作するために使用します。たとえば、設定変更の効果をテストするためなど)。編集したばかり)。また、注意深く監視する必要がある重要なものが画面から消えない場合(VimでCtrl-Zまたは:shellを使用すると何が起こるかなど)、私の認識、保持、およびメンタルワークフローにも役立ちます。
mvanle 2014年

それは私の時間の多くを節約する素晴らしい答えです。
jerry_sjtu 2015年

素敵な答え!それをさらに褒めるため:r! command [ENTER]に、コメントに記載されていることも追加します。
ジーク

152

これを回避する方法は次のとおりです。

  • Ctrl+ ZでVimを一時停止します。
  • ターミナルで遊ぶ
  • 次に、コマンドを入力するだけで、Vimをそのまま使用した場所に戻りますfg

14
:!bashそれを行うためのより良い方法です
0atman

私は彼が機能のような一種のドリームピーを望んでいると思います
アダム・ミラー

10
@オートマンなぜ:!bashより良いですCtrl+zか?(ただ疑問に思う)
セバスチャングリニョリ2013

2
であるためSebastiánGrignoli@ Ctrl+Z、たとえば、あなたはその後、別のフォルダに移動することができls、その後git status、などをCtrl+Z「一時停止」で、あなたが「再開」することができますfg。しかし、:!bashを使用すると、これまでに知っているように、一度に実行できるコマンドは1つだけです。また、一度に複数のコマンドを実行できる場合でも、まだ便利ではありません。つまり、全体として「Ctrl + Z」の方がはるかに優れています
Leo

+1これはほとんどすべての環境で機能するためです。私がカスタマイズできない外部システムで作業し、安価なPuTTYシェルを介して、これはうまく機能します。
t3sture 2017

121

Vimのバージョンで有効になっている場合は、:termコマンドを使用して端末を起動できます。

端末ウィンドウのサポートがVim 8に追加されました。これは、+端末機能を使用してVimをコンパイルするときに有効にできるオプション機能です。お使いのバージョンのVimがターミナルをサポートしている場合、:echo has('terminal')「1」が出力されます。

入力:termすると、ターミナルジョブモードになり、ターミナルを期待どおりに使用できます。

Terminal-Jobモード内で、押すCtrl-W NCtrl-\ Ctrl-N、モードをTerminal-Normalに切り替えます。これにより、Vimの通常モードと同様に、カーソルを移動したり、コマンドを実行したりできます。ターミナルジョブモードに戻すには、iます。

他の回答はNeovimの同様の機能に言及しています。


5
ictrl-wNブラウズモードから切り替えた後、ターミナルコマンドモードに切り替える方法の+1 。これはtmuxよりも優れた機能であり、Windowsでも機能します。
radke 2017年

1
を使用して垂直分割することは可能:termですか?
Vitaly Zdanevich 2017年

1
素晴らしい!ターミナルが組み込まれているので、プラグインを追加する必要はありません。経由brew install vim --override-system-viでvim 8にアップグレードされ、:term完全に動作します。共有してくれてありがとう!
LeOn-Han Li

18
@VitalyZdanevich :vertical :termは、左側のウィンドウのターミナルで垂直に分割されます。:vertical :botright :term右側のウィンドウのターミナルで垂直に分割されます。または、手動でウィンドウをレイアウトし、を使用:term ++curwinしてアクティブウィンドウでターミナルを開くこともできます。
ダニエルS.

esc ctrl-w wを使用すると、ウィンドウを切り替えることができます
user1869582

87

:shその後ctrl+d、(bash)に戻る

更新

ctrl+dvimでマップしてrunを実行すると:sh、bashとvimをすばやく切り替えることができます。

noremap <C-d> :sh<cr>


1
私が考えるctrl+zfg、わずかに速くあなたが入力する必要はありません与えている:shような場合には。
Alex

@Alexいいえ:sh、マップを行う場合は入力する必要はありません。後にnoremapすることができますだけで、Ctrl+DVIMからのsh、そして以降^Dに終了EOF、であるshあなたがvimのに戻りますので、。1つのキーでshとvimを切り替えることができます。
no1xsyzy

42

Vim 8.1の主な新機能は、Vimウィンドウで端末を実行するためのサポートです。

:term Vim内の別のウィンドウでターミナルを開きます。


2
これは完全に機能します、ありがとう!あなたの答えは、元の質問の精神にはるかに近いものです
subelsky

こんにちは、このモードを終了する方法を知っていますか?
user3289737

2
通常のターミナルと同様に、ターミナルから終了し、ウィンドウを閉じるためにexit使用:qします
Yossarian42

2
@ user3289737または、Ctrl + Wを2回続けて押すと、ウィンドウを切り替えることができます。これはターミナルウィンドウに固有のものではなく、同様に機能します。
flarn2006

39

最終的に、ネイティブ:terminalコマンドがvimに2017年に追加されました。

これは:terminal readme からの抜粋です。

この機能は、Vimウィンドウでターミナルエミュレータを実行するためのものです。端末エミュレーターに接続してジョブを開始できます。たとえば、シェルを実行するには:

 :term bash

または、ビルドコマンドを実行するには:

 :term make myprogram

ジョブはVimから非同期で実行され、ウィンドウは更新され、別のウィンドウで編集しているときにもジョブからの出力が表示されます。


端末は同じタブのバッファで実行されます。そのため、vimで複数のファイルを使用することに慣れている場合は、いくつかの問題に直面する可能性があります。スイッチングバッファは、最終的にはターミナルから戻ってきません。ターミナルを強制終了する必要があります。あなたがこれを知っている限り、それは問題ないはずです。開発者がこれに対する回避策を用意してくれることを願っています。
ArunMKumar 2018

1
@ArunMKumar [Ctrl + W]を使用してターミナルから「エスケープ」し、:bn通常どおり実行します。ターミナルを殺す必要はなく、それはノーリターンのポイントではありません:)
fjardon

おかげで、バディは完全にそれを逃した。:bnをキーにキーマップしましたが、機能しなくなり、再び機能します。それは私の悪かった。
ArunMKumar 2018

2017?2018年のことですか?
flarn2006 '11 / 11/18

1
@ flarn2006、2017対2018に関して、Vim 8.1は2018年5月18日にvim.orgで発表され、「Vimウィンドウでの端末の実行のサポート」が「主な新機能」としてリストされています。この機能は、2017年7月7日、パッチ8.0.0693で最初に利用可能になりました。github.com/vim/vim/commit/...
ダニエルS.

32

この質問はかなり古いですが、それを見つけた人のために、新しい可能な解決策があります:Neovimには、ConqueTermが試みたとおりのことを行う本格的なファーストクラスのターミナルエミュレーターが含まれています。単に実行し:term <your command here>ます。

<C-\><C-n>期間モードを終了して通常モードに戻ります。あなたが私のようなもので、エスケープが期間モードを終了することを好む場合は、これをnvimrcに追加できます。

tnoremap <ESC><ESC> <C-\><C-N>

ESCを2回押すと、ターミナルモードが終了して通常モードに戻ります。そのため、実行中のコマンドが書き込んでいるバッファを操作できます。

心に留めておきますが、この回答を投稿する時点でnvimは開発が進んでいるため、ターミナルモードを終了する別の方法が追加される可能性があります。Ctrl+\Ctrl+nほとんどから通常モードへの切り替えの任意のモード、私はこの答えが間違っているなるが、それは仕事をしない場合、この答えが古いかもしれないと承知しているであろうことを期待していません。

https://github.com/neovim/neovim


29

:term

この機能はVim 8.1で新たに追加されましたが、この投稿の時点でリリースされたばかりなので、使用するために更新が必要になる場合があります。


vim 8.1より前に追加されました。これは、vim 8.0.001にはない主な大きな機能です。それがvim 8.1の新奇性として宣伝されている理由です。2017年10月のダニエルの回答と2018年4
Luc

17

私は質問に直接答えていませんが、それは良いアプローチだと思います。誰もtmuxについて言及していません(または少なくともスタンドアロンの回答としては言及していません)。Tmuxは、画面のようなターミナルマルチプレクサです。ほとんどのものは両方のマルチプレクサで作成できますが、tmuxを構成する方が簡単です。また、現在tmuxはscreenよりも積極的に開発されており、構成を支援するツールなど、非常に大きなエコシステムが周囲にあります。

また、vimには、別のプラグインViMUXがあります。ViMUXは、両方のツール間の相互作用に役立ちます。次のコマンドでコマンドを呼び出すことができます。

:call VimuxRunCommand("ls")

このコマンドは、vimが存在する現在のペインの下に小さな水平分割を作成します。

コマンド全体を実行したくない場合は、プロンプトから実行することもできます。

<Leader>vp :VimuxPromptCommand<CR>

十分ではなかったので、少なくとも6つの「プラットフォーム固有のプラグイン」があります。

  • vim-vroom:rspec、cucumber、およびtest / unitのランナー。vimuxサポートg:vroom_use_vimux
  • vimux-ruby-test:rubyテストを簡単に実行するための一連のコマンド
  • vimux-cucumberVimuxで Cucumber機能を実行する
  • vim-turbux:tmuxによるターボRubyテスト
  • vimux-pyutils:ipythonでコードブロックを実行できるvimux用の関数のセット
  • vimux-nose-test:vimuxでノーズテストを実行する

ここに素敵な「ユースケース」があります:VimuxとTurbuxをSporkとGuardで使用してオンデマンドでテストする


なぜ反対票が投じられたのかを説明しますか?(6年前の回答であることに加えて)
パブロオルモスデアギレラC.

13

誰かがすでにhttps://github.com/Shougo/vimshell.vimを提案しましたが、その理由については触れられていませんでした。その結果、この質問から離れたとき、他の(はるかに高いランクの)オプションを試すために、他の多くの時間を無駄にしました。

Shougo / vimshellが答えです。理由は次のとおりです。

端末エミュレータであることに加えて、VimShellを使用すると、通常モードおよびビジュアルモードで端末出力をナビゲートできます。したがって、実行するコマンドの結果が、キーボードのみを使用してコピーアンドペーストしたい場合、VimShellがこれをカバーします。

NeoVimの:terminalコマンドを含む、言及されている他のオプションはこれを行いません。Neovimの:terminalは近づいていますが、2017年2月18日現在、少なくとも以下の点で不十分です。

  • カーソルをバッファの最後に移動します。最後に、VimShellのように同じ場所にカーソルを保持します。時間の浪費。

  • Githubこれに関するディスカッションをmodifiable = 1表示することはサポートされていないため vim-easymotionなどの便利なプラグインは使用できません。

  • Vimshellのように行番号の表示をサポートしていません。

Neovimの:terminalを含む他のオプションに時間を浪費しないでください。VimShellを使用してください。


1
NeoVimでは、通常/ビジュアルモードでターミナル出力からナビゲートおよびコピーできます。私はいつもこれをします。NVIM 0.1.6-devの使用
Alice Heaton

ありがとう、VimShellを試してみます。しかし、私は答えから誤った声明を取り除く自由を取っています。@Aliceが指摘したように、NeoVim :terminalもまったく同じことができます。
Konrad Rudolph、

:terminal:VimShellナビゲーションや編集、基本的な方法と同じことはできません。上記の説明の編集を参照してください。
user3751385 2017


8

いいえ、あなたがすることはできません:

http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window


2
アドバイスをしないsplitvtでください-色制御コードが壊れ、vimまったく使用できなくなります。
new123456

12
「いいえ」は悪い答えです。より良い答えは、「デフォルトでは、いいえ」です。技術的にはそれが可能で、おそらく新しいソースコードを作成して自分でコンパイルするか、プラグインを作成する必要があります。易しいですか?そうではないかもしれませんが、それは可能です。単に「いいえ」と言うことは、「いいえ、私はしません」と言うことに似ています。
trusktr 2013

2
@AnishRamaswamy(emacsとは異なり)ストックvimを使用してvimバッファー内でシェルを実行することはまだ不可能です。それがOPの質問でした。
アンバー

1
@アンバー、ええ、OPがストックvimを使用することについて言及していなかった場合は問題ありません。
アニッシュラマスワミー2014

3
誰かがこの回答を編集して、標準のvimではそれができないと言うべきです。
still_dreaming_1 2014

4

私が知っている唯一の方法は、サードパーティのパッチであるvim-shellを使用することです。


わかりやすく言うと、vim-shellはパッチであり、「アドオン」ではありません(少なくとも、これはスクリプトであることを意味します)。私は個人的には試していませんが、残念ながらVim wikiのvim-shellページは、Vim 7.1以降ではコンパイルできないことを示唆しています。
イェージ2008

ペダントをなだめるように変更。:)(15文字を超えるものを入力する必要がありました。「固定」は十分に長くありませんでした)
romandas '08 / 08/06

Shougo / vimshell(github.com/Shougo/vimshell.vim)は、うまく機能しているようです。動的ライブラリを構築する必要がありますが、それは非常に簡単です(cd <vim> / vimproc; make)
Wayne Walker



2

お使いのバージョンのvimが+term最初にコマンドをサポートしている場合、vimのシェルを1つのコマンド(たとえばset=/usr/bin/zsh)で使用するように設定してから、コマンド+term(つまりbo 15vs +term)を実行します。あなたはあなたのウィンドウのいくつかの追加の操作を行う必要があるかもしれません(すなわち、1つを削除して回転させる)が、あなたはあなたのターミナルを持っているでしょう。


0

私はあなたの質問に厳密に答えているわけではないことを認めますが、Vimとターミナルを同じウィンドウで使用するときに私にとってよりうまく機能したのは、Tmuxです(これは、画面と同様に、「バックグラウンドソフトウェアで実行」のようなものですが、これは1つはスプリットとタブでより効果的に機能します)。

この投稿は、それらがどのように連携するかを理解するのに役立ちます:「TmuxとVim —さらに連携すると」

この方法でVimを強力なIDEに変換できます


0

画面を分割してコマンドterm ++curwinを実行し、ターミナルをVimバッファー内で実行します。次のコマンドは両方を実行し、私のために働きました:

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