Wie betreibe ich ein Terminal in Vim?


304

Ich bin an Emacs gewöhnt, aber ich probiere Vim aus, um herauszufinden, welches mir besser gefällt.

Eine Sache, die ich an Emacs mag, ist die Fähigkeit, ein Terminal in Emacs zu betreiben. Ist das innerhalb von Vim möglich? Ich weiß, dass Sie Befehle von Vim ausführen können, aber ich möchte ein Terminal innerhalb einer Registerkarte ausführen können.



42
Ist , :! <command>was Sie suchen?
Takeshin

48
Seit Vim 8.0 gibt es einen :termBefehl, der ein neues Terminal in einem neuen geteilten Fenster öffnet. Wenn es bei Ihnen nicht funktioniert, überprüfen Sie, vim --version | grep -o .terminalob diese Funktion verfügbar ( +terminal) oder nicht verfügbar ( -terminal) ist.
Susam Pal

Antworten:


123

Ich würde auf jeden Fall screenfür so etwas empfehlen . Vim ist ein Texteditor, keine Shell.

Ich würde verwenden Ctrl+AS, um das aktuelle Fenster horizontal zu teilen, oder in Ubuntus Bildschirm und anderen gepatchten Versionen können Sie Ctrl+A|(Pipe) verwenden, um vertikal zu teilen. Verwenden Sie dann Ctrl+ATab(oder gleichwertig auf einigen Systemen, Ctrl+ACtrl+Idie möglicherweise einfacher zu tippen sind), um zwischen den Fenstern zu wechseln. Es gibt andere Befehle zum Ändern der Größe und Anordnung der Fenster.

Oder eine weniger fortgeschrittene Verwendung von screenbesteht darin, einfach mehrere Vollbildfenster zu öffnen und zwischen ihnen umzuschalten. Dies ist, was ich normalerweise mache, ich benutze die Split-Screen-Funktion nur gelegentlich.

Die Frage zum GNU Screen Survival Guide enthält eine Reihe guter Tipps, wenn Sie mit der Verwendung nicht vertraut sind.


7
+1 Ich habe erst kürzlich das Bildschirm-Evangelium erhalten. Ich frage mich, wie ich ohne gelebt habe.
Waffen

118
Ich würde lieber tmux anstelle von screen wählen.
Tomaszkubacki

81
Ja, natürlich kann man screen oder tmux oder terminator ausführen oder ein anderes Fenster und einen anderen Alt-Tab öffnen oder sogar einen KVM-Schalter verwenden, der mit einem Fußpedal aktiviert ist. Aber das ist nicht der Punkt - all diese Lösungen opfern die Integration zwischen Terminal und VIM, weshalb man sich die Mühe machen würde, in diesem Bereich nach Lösungen zu suchen. Ich verstehe nicht, wie diese Antwort überhaupt eine Antwort ist, geschweige denn eine Top- oder akzeptierte Antwort. Ich denke, ich werde es mit Conque versuchen.
Stabledog

33
wie ist das die top antwort ??? Sie müssen die Abstimmung aufheben und die nächste Antwort ablehnen, die Ihre Frage tatsächlich beantwortet. Bei Verwendung von screen wird keine Shell in vim ausgeführt. Das ist so, als würde man jemandem sagen, er solle eine andere Shell starten. Und für diejenigen, die immer wieder ":!" er sagte bereits, er wisse, wie man Befehle ausführt, was NICHT das ist, wonach er gefragt hat ... meine Güte. Die Arroganz ist hier so groß, dass man sie mit einem Messer schneiden kann.
Osirisgothra

6
Diese Antwort sollte aufgrund der neuen vim 8.1-Funktion Terminal Window
Alan Garrido

232

Veraltet ab August 2011

Schauen Sie sich Conque Shell an (auch auf GitHub ). Ermöglicht das Ausführen eines interaktiven Programms in vim, nicht nur einer Shell.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... der rekursive Horror !!
Keflavich

1
Psihodelia scheint recht zu haben. Ich habe gerade vim mit --enable-pythoninterp kompiliert (cygwin verteilt vim nicht mit + python) und nach der Installation von ConqueTerm erhalte ich eine Fehlermeldung von #set_buffer_settings. Ich konnte weder feststellen, wo diese Funktion lebt, noch eine Vorstellung davon bekommen, was der Fehler bedeutet. Die Nachricht enthält eine Anweisung zu einem ungültigen Argument "edit ++ enc = utf-8 bash \ - \ 2". Argh.
Nate Kennedy

47
Um die Rekursion zu verstehen, müssen Sie zuerst die Rekursion verstehen.
Stabledog

19
@ Łukasz Niemier VIMCEPTION
Sebastián Grignoli

1
Es scheint, dass dies nicht mehr unterstützt wird, hat jemand eine Alternative?
Dykeag

204

Ich bin mir nicht sicher, was genau Sie erreichen möchten (ich habe Emacs noch nie verwendet), aber Sie können Befehle in Vim ausführen, indem Sie Folgendes eingeben:

:! somecommand [ENTER]

Und wenn Sie mehrere Befehle eingeben oder eine Weile in einer Shell herumspielen möchten, können Sie immer Folgendes verwenden:

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

Sobald der Befehl oder die Shell beendet ist, können Sie drücken Enter, um zu Ihrem Editorfenster zurückzukehren

Vim ist absichtlich leichtgewichtig und nicht in der Lage, nicht redaktionelle Aufgaben auszuführen, genauso wie das Ausführen einer vollständigen Shell in einem Vim-Bereich / Tab, aber wie oben erwähnt, gibt es Addons von Drittanbietern wie Vim-Shell, die dies ermöglichen so etwas zu tun.

Wenn ich zwischen Vim und meiner Shell (Bash) wechseln möchte, drücke ich normalerweise einfach CTRL+, Zum den Vim-Prozess anzuhalten, in meiner Shell herumzuspielen und dann 'fg' einzugeben, wenn ich zu Vim zurückkehren möchte. Dabei behalte ich meinen Editor und meinen Shell schön und getrennt.


17
Und wenn Sie die Ausgabe des Befehls in den aktuellen Puffer kopieren möchten :: r! dir
Cyber ​​Oliveira

6
Ich benutze sowohl Emacs als auch Vim (und habe viel mehr Erfahrung mit Vim). Ich habe jedoch festgestellt, dass es oft schöner und einfacher ist, mit zwei Ansichten gleichzeitig zu arbeiten (eine, um zu sehen, was Sie bearbeiten, und eine, um in einer interaktiven Shell zu arbeiten - zum Beispiel, um die Auswirkungen einer Konfigurationsänderung zu testen gerade bearbeitet). Es hilft auch bei meiner Wahrnehmung, Beibehaltung und mentalen Arbeitsabläufe, wenn wichtige Dinge, die ich möglicherweise genau überwachen muss, nicht vom Bildschirm verschwinden (wie das, was passiert, wenn Sie Strg-Z oder: Shell in Vim verwenden).
mvanle

Es ist eine großartige Antwort, die mir viel Zeit sparen wird.
jerry_sjtu

Gute Antwort! Um es noch weiter zu ergänzen, möchte ich auch die :r! command [ENTER]in den Kommentaren erwähnten hinzufügen .
Jeach

152

Die Art und Weise, wie ich das umgehen kann, ist:

  • Pause Vim mit Ctrl+ Z,
  • im Terminal spielen,
  • Kehren Sie dann genau dorthin zurück, wo Sie mit Vim abgereist sind, indem Sie einfach den Befehl eingeben fg.

14
:!bashist eine schönere Art, das zu tun
0atman

Ich denke, er will eine Art Dreampie wie Funktionalität
Adam Miller

10
@Oatman Warum ist :!bashschöner als Ctrl+z? (Ich wundere mich nur)
Sebastián Grignoli

2
@ SebastiánGrignoli weil mit Ctrl+Z, zum Beispiel, können Sie in einem anderen Ordner verschieben, dann lsdann git statususw. Ctrl+Zist eine „Pause“ können Sie „Lebenslauf“ mit fg. Aber mit :! Bash können Sie, wie ich bisher weiß, nur einen einzigen Befehl gleichzeitig ausführen, oder selbst wenn Sie mehr als einen Befehl gleichzeitig ausführen können, ist dies immer noch nicht bequem. Insgesamt ist 'Strg + Z' also viel besser
Leo

+1, weil dies in so ziemlich jeder Umgebung funktioniert. Bei der Arbeit an einem fremden System, das ich nicht anpassen kann, und über eine billige PuTTY-Shell funktioniert dies hervorragend.
t3sture

121

Wenn in Ihrer Version von Vim aktiviert, kann ein Terminal mit dem :termBefehl gestartet werden .

Die Unterstützung von Terminalfenstern wurde zu Vim 8 hinzugefügt. Dies ist eine optionale Funktion, die beim Kompilieren von Vim mit der Terminalfunktion + aktiviert werden kann. Wenn Ihre Version von Vim Terminalunterstützung bietet, :echo has('terminal')wird "1" ausgegeben.

Durch Eingabe :termwerden Sie in den Terminal-Job- Modus versetzt, in dem Sie das Terminal wie erwartet verwenden können.

Im Anschluss-Job - Modus, Drücken Ctrl-W Noder Ctrl-\ Ctrl-Nschaltet den Modus - Terminal-Normal , die der Cursor bewegt werden kann und Befehle RAN werden ähnlich wie Vims Normaler Modus. Drücken Sie, um zum Terminal-Job- Modus zurückzukehren i.

Andere Antworten erwähnen ähnliche Funktionen in Neovim.


5
+1 für das Zurückschalten in den Terminal-Cmd-Modus mit inach dem Umschalten vom Strg-WN-Suchmodus. Dies ist sogar über tmux eine Killer-Funktion und funktioniert auch unter Windows.
Radke

1
Ist eine vertikale Aufteilung mit möglich :term?
Vitaly Zdanevich

1
Super! Großartig, dass das Terminal eingebaut ist, damit wir nicht mit mehr Plugins herumspielen müssen. Upgrade auf Vim 8 über brew install vim --override-system-viund :termfunktioniert einwandfrei. Danke für das Teilen!
LeOn - Han Li

18
@VitalyZdanevich :vertical :termwird vertikal mit dem Terminal im linken Fenster geteilt. :vertical :botright :termwird vertikal mit dem Terminal im rechten Fenster geteilt. Alternativ können Sie Fenster manuell gestalten und dann :term ++curwinein Terminal im aktiven Fenster öffnen.
Daniel S.

Mit esc ctrl-w w können Sie zwischen Windows wechseln
user1869582

87

:shdann ctrl+dwieder rein (bash)

Update :

Sie können ctrl+dvim zum Ausführen zuordnen :sh, wodurch Sie schnell zwischen bash und vim wechseln können.

noremap <C-d> :sh<cr>


1
Ich denke ctrl+zund bin fgetwas schneller, da Sie :shin diesem Fall nicht tippen müssen .
Alex

@Alex nein du musst nicht tippen :shwenn du die map machst. Danach noremapkönnen Sie einfach Ctrl+Dvon vim zu shund da ^Dist EOF, das das beendet sh, so dass Sie zu vim zurückkehren würden. Die eine Taste kann zwischen shund vim umschalten.
no1xsyzy

42

Die wichtigste neue Funktion von Vim 8.1 ist die Unterstützung für die Ausführung eines Terminals in einem Vim-Fenster.

:term öffnet das Terminal in einem anderen Fenster in Vim.


2
das funktioniert perfekt, danke! Ihre Antwort ist viel mehr im Geiste der ursprünglichen Frage
Subelsky

Hallo, wissen Sie, wie Sie diesen Modus verlassen können?
user3289737

2
Wie im normalen Terminal exitwird das Terminal verlassen und dann :qzum Schließen des Fensters verwendet
Yossarian42

2
@ user3289737 Alternativ können Sie zweimal hintereinander Strg + W drücken, um zwischen Fenstern zu wechseln. Dies ist nicht spezifisch für Terminalfenster, funktioniert aber genauso gut.
Flarn2006

39

Schließlich :terminalwurde vim 2017 ein nativer Befehl hinzugefügt.

Hier ist ein Auszug aus der : terminal readme:

Diese Funktion dient zum Ausführen eines Terminalemulators in einem Vim-Fenster. Ein Job kann mit dem Terminalemulator verbunden gestartet werden. So führen Sie beispielsweise eine Shell aus:

 :term bash

Oder um den Build-Befehl auszuführen:

 :term make myprogram

Der Job wird asynchron von Vim aus ausgeführt. Das Fenster wird aktualisiert, um die Ausgabe des Jobs anzuzeigen, auch während die Bearbeitung in einem anderen Fenster erfolgt.


Das Terminal wird in einem Puffer auf derselben Registerkarte ausgeführt. Wenn Sie es also gewohnt sind, mehrere Dateien in vim zu verwenden, können Schwierigkeiten auftreten. Das Umschalten der Puffer kommt schließlich zum Terminal, von wo aus es keinen Punkt mehr gibt. Sie müssen das Terminal töten. Solange Sie sich dessen bewusst sind, sollte es in Ordnung sein. Ich hoffe, die Entwickler kommen mit einer Problemumgehung dafür.
ArunMKumar

1
@ArunMKumar Verwenden Sie [Strg + W], um aus dem Terminal zu "entkommen", und gehen Sie dann :bnwie gewohnt vor. Keine Notwendigkeit, das Terminal zu töten und es ist kein Punkt ohne Wiederkehr :)
Fjardon

Danke, Kumpel, habe es total verpasst. Ich habe Keymapping : BN zu einem Schlüssel und es funktioniert nicht mehr, es funktioniert wieder. Es war mein schlechtes.
ArunMKumar

2017? Du meinst 2018?
Flarn2006

1
@ flarn2006, in Bezug auf 2017 gegenüber 2018, wurde Vim 8.1 am 18. Mai 2018 auf vim.org angekündigt, wobei "Unterstützung für das Ausführen eines Terminals in einem Vim-Fenster" als "Hauptneuheit" aufgeführt ist. Die Funktion war erstmals am 7. Juli 2017 in Patch 8.0.0693 verfügbar. github.com/vim/vim/commit/…
Daniel S.

32

Diese Frage ist ziemlich alt, aber für diejenigen, die sie finden, gibt es eine neue mögliche Lösung: Neovim enthält einen vollwertigen, erstklassigen Terminalemulator, der genau das tut, was ConqueTerm versucht hat. Einfach laufen :term <your command here>.

<C-\><C-n>beendet den Term-Modus wieder im Normal-Modus. Wenn Sie wie ich sind und es vorziehen, dass Escape den Term-Modus beendet, können Sie dies Ihrem nvimrc hinzufügen:

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

Wenn Sie dann zweimal auf ESC drücken, wird der Terminalmodus wieder in den Normalmodus versetzt, sodass Sie den Puffer bearbeiten können, in den der noch laufende Befehl schreibt.

Beachten Sie jedoch, dass sich nvim zum Zeitpunkt der Veröffentlichung dieser Antwort in einer starken Entwicklung befindet. Möglicherweise wird eine weitere Möglichkeit zum Beenden des Terminalmodus hinzugefügt. Da ich Ctrl+\Ctrl+nvon fast jedem Modus in den normalen Modus wechsle, erwarte ich nicht, dass diese Antwort falsch wird. Beachten Sie jedoch, dass diese Antwort möglicherweise veraltet ist, wenn sie nicht funktioniert.

https://github.com/neovim/neovim


29

:term

Diese Funktion wurde jedoch in Vim 8.1 neu hinzugefügt, das zum Zeitpunkt dieser Veröffentlichung erst kürzlich veröffentlicht wurde. Daher müssen Sie möglicherweise ein Update durchführen, um sie verwenden zu können.


Es wurde vor vim 8.1 hinzugefügt. Es ist nur das wichtigste Feature, das vim 8.0.001 nicht hatte. Aus diesem Grund wird es als vim 8.1-Neuheit beworben. Siehe Daniels Antwort vom Oktober 2017 und die von Fjardon im April 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Luc Hermitte

17

Ich weiß, dass ich die Frage nicht direkt beantworte, aber ich denke, es ist ein guter Ansatz. Niemand hat tmux erwähnt (oder zumindest nicht als eigenständige Antwort). Tmux ist ein Terminal-Multiplexer-ähnlicher Bildschirm. Die meisten Sachen können in beiden Multiplexern gemacht werden, aber afaik tmux ist es einfacher zu konfigurieren. Außerdem wird tmux derzeit aktiver entwickelt als der Bildschirm, und es gibt ein ziemlich großes Ökosystem, wie Tools, die bei der Konfiguration helfen, z.

Auch für vim gibt es ein weiteres Plugin: ViMUX , das bei der Interaktion zwischen beiden Tools sehr hilfreich ist. Sie können Befehle aufrufen mit:

:call VimuxRunCommand("ls")

Dieser Befehl erstellt eine kleine horizontale Aufteilung unterhalb des aktuellen Bereichs, in dem sich vim befindet.

Sie können auch eine Eingabeaufforderung ausführen, falls Sie nicht den gesamten Befehl ausführen möchten:

<Leader>vp :VimuxPromptCommand<CR>

Da es nicht genug war, gibt es mindestens 6 'plattformspezifische Plugins':

  • vim-vroom : Läufer für Rspec, Gurke und Test / Einheit; Vimux-Unterstützung überg:vroom_use_vimux
  • vimux-ruby-test : Eine Reihe von Befehlen zum einfachen Ausführen von Ruby-Tests
  • vimux-cucumber : Führen Sie Cucumber Features über Vimux aus
  • vim-turbux : Turbo Ruby-Test mit tmux
  • vimux-pyutils : Eine Reihe von Funktionen für vimux, mit denen Codeblöcke in ipython ausgeführt werden können
  • Vimux-Nasentest : Führen Sie Nasentests in Vimux durch

Hier ist ein schöner "Anwendungsfall": Tests auf Anfrage mit Vimux und Turbux mit Spork und Guard


Möchten Sie erklären, warum es abgelehnt wurde? (außer eine Antwort von vor 6 Jahren)
Pablo Olmos de Aguilera C.

13

Jemand hat bereits https://github.com/Shougo/vimshell.vim vorgeschlagen , aber er hat nicht erwähnt, warum. Als ich von dieser Frage wegkam, verschwendete ich viel Zeit damit, die anderen (viel höherrangigen) Optionen auszuprobieren.

Shougo / Vimshell ist die Antwort. Hier ist der Grund:

VimShell ist nicht nur ein Terminalemulator, sondern ermöglicht Ihnen auch die Navigation durch die Terminalausgabe im normalen und visuellen Modus. Wenn ein von Ihnen ausgeführter Befehl zu einer Ausgabe führt, die Sie nur über die Tastatur kopieren und einfügen möchten ... VimShell behandelt dies.

Keine der anderen genannten Optionen, einschließlich des Befehls: terminal in NeoVim, führt dies aus. Neovims: Terminal kommt nahe, bleibt aber ab dem 18.02.2017 zumindest auf folgende Weise zurück:

  • Bewegt den Cursor an das Ende des Puffers, anstatt ihn zuletzt an der gleichen Stelle wie VimShell zu belassen. Riesige Zeitverschwendung.

  • Stützt nicht modifiable = 1sehen eine Diskussion zu diesem Thema auf Github , so hilfreich Plugins wie vim-Easymotion kann nicht verwendet werden.

  • Unterstützt nicht die Anzeige von Zeilennummern wie Vimshell.

Verschwenden Sie keine Zeit mit den anderen Optionen, einschließlich Neovims: Terminal. Gehen Sie mit VimShell.


1
Mit NeoVim können Sie im normalen / visuellen Modus vom Terminalausgang aus navigieren und kopieren. Ich mache das die ganze Zeit. Verwenden von NVIM 0.1.6-dev
Alice Heaton

Danke, ich werde VimShell ausprobieren. Ich habe mir jedoch erlaubt, eine falsche Aussage aus der Antwort zu entfernen. Wie @Alice betonte, kann NeoVim's :terminalabsolut das Gleiche tun.
Konrad Rudolph

:terminalkann nicht dasselbe tun wie :VimShellin Bezug auf Navigation und Bearbeitung und auf grundlegende Weise. Siehe Erklärung oben bearbeiten.
user3751385

9

Vielleicht möchten Sie einen Blick auf den :shBefehl werfen (siehe :help shin Vim).

Verschiedene Befehle


Verwenden Sie zsh also nicht mit vim. set shell=/bin/shwird vim dazu bringen, eine leisere Shell für seine Befehle zu verwenden.
Ross Presser

8

2
Nehmen splitvtSie nicht den Rat von - es verstümmelt die Farbkontrollcodes und macht vimvöllig unbrauchbar.
new123456

12
"Nein" ist eine schlechte Antwort. Eine bessere Antwort lautet "Standardmäßig nein." Technisch ist dies möglich, und möglicherweise müssen Sie neuen Quellcode schreiben und selbst kompilieren oder ein Plugin schreiben. Ist es einfach? Vielleicht nicht, aber es kann getan werden. Einfach Nein zu sagen ist eher wie "Nein, ich werde es nicht tun".
trusktr

2
@AnishRamaswamy Es ist immer noch nicht möglich, eine Shell innerhalb eines Vim-Puffers mit Stock Vim auszuführen (im Gegensatz zu Emacs). Das war die Frage des OP.
Amber

1
@ Amber, Ja, das wäre in Ordnung, außer das OP erwähnte nicht die Verwendung des Stock Vim.
Anish Ramaswamy

3
Jemand sollte diese Antwort einfach bearbeiten, um zu sagen, dass Sie dies mit stock vim nicht tun können.
still_dreaming_1

4

Ich kenne nur die Verwendung von vim-shell , einem Patch von Drittanbietern.


Um pedantisch zu sein, ist vim-shell ein Patch, kein 'Add-On' (was für mich zumindest impliziert, dass es sich um ein Skript handelt). Ich habe es nicht persönlich ausprobiert, aber die Vim-Shell-Seite im Vim-Wiki deutet leider darauf hin, dass es nicht mit Vim 7.1+ kompiliert werden kann.
Yewge

Geändert, um den Pedanten zu beruhigen. :) (Musste etwas länger als 15 Zeichen
eingeben

Shougo / vimshell ( github.com/Shougo/vimshell.vim ) scheint ziemlich gut zu funktionieren. Es erfordert das Erstellen einer dynamischen Bibliothek, ist aber recht einfach (cd <vim> / vimproc; make)
Wayne Walker


2

Probieren Sie vterm aus , eine Shell mit fast allen Funktionen in vim. Es ist leicht fehlerhaft mit seiner Geschichte und klaren Funktionen und befindet sich noch in der Entwicklung, aber es ist immer noch ziemlich gut


2

Angenommen, Ihre Version von vim unterstützt +termzuerst den Befehl, legen Sie die Shell für vim fest, die in einem Befehl verwendet werden soll (z. B. set=/usr/bin/zsh), und führen Sie dann den Befehl aus +term(dh bo 15vs +term). Möglicherweise müssen Sie einige zusätzliche Manöver an Ihren Fenstern durchführen (dh eines löschen und drehen), aber Sie haben Ihr Terminal.


0

Ich gebe zu, dass ich Ihre Frage nicht streng beantworte, aber was für mich besser funktioniert hat, wenn ich Vim und Terminals im selben Fenster verwende, ist Tmux (eine Art "Run in the Background-Software", ähnlich wie auf dem Bildschirm, obwohl dies der Fall ist man arbeitet besser mit Splits und Tabs).

Dieser Beitrag hilft Ihnen zu verstehen, wie sie zusammenarbeiten: 'Tmux und Vim - noch besser zusammen' .

Auf diese Weise können wir Vim in eine leistungsstarke IDE konvertieren


0

Teilen Sie den Bildschirm und führen Sie den Befehl aus term ++curwin, um das Terminal im Vim-Puffer auszuführen. Der folgende Befehl macht beides und hat für mich funktioniert:

:bo 10sp | term ++curwin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.