Kann ich im Vim-Fenster eine interaktive Shell ausgeben?

16

Ich weiß , ich kann :!oder :r!externen Befehl auszuführen und gegebenenfalls seine Ausgabe in Text einfügen. Ich kann sogar performen :!shund ich werde eine Shell erzeugen , die so lange lebt, bis ich sie verlasse - aber während die Shell aktiv ist, schläft Vim und ist nicht erreichbar. Ich muss die Shell verlassen und eine neue erzeugen, wenn ich für einen Moment zu Vim zurückkehren möchte - nicht sehr nützlich.

Ich kann Shell auf dem entgegengesetzten Ende zuzugreifen, durch Vim Aussetzung mit ^Zund verwalten die Vim Job durch bg, fgund jobs. Dies ist sinnvoller, aber auf lange Sicht sehr umständlich. Ich kann es verwenden, Screenwenn es verfügbar ist (oft nicht), oder mehrere Fenster meines Fenstermanagers öffnen (und ssh, um von jedem der beiden nacheinander auf den Host zu zielen, um sowohl vim als auch shell auf dem Remote-Host zu haben, was wiederum umständlich ist.)

Es wäre am saubersten, wenn Vim mir erlauben würde, eine Shell-Sitzung zu öffnen und sie beispielsweise in einem ihrer (internen) Fenster zu speichern oder zu ihr und zurück zu wechseln. Ist so etwas möglich?

SF.
quelle
1
Sie möchten also im Grunde eine Shell in einem öffnen :split, während Sie die Datei im anderen Fenster behalten? ... Das klingt für mich wie ein Job für tmux oder Bildschirm ...
Martin Tournoij
1
@Carpetsmoker: Ich habe oft keine Kontrolle darüber, was auf dem Remote-System installiert ist, und meistens ist keines der beiden, während Vim immer da ist.
SF.
Ziehen Sie in Betracht, zu Neovim zu wechseln. Es hat jetzt einen eingebauten Terminal-Emulator, der recht gut funktioniert und in einem vim-Puffer geöffnet werden kann.
Zach

Antworten:

16

Es gibt einige vim-Plugins, die dies ermöglichen. Ich benutze Conque ( Github ).

Nachdem Sie es in Ihr Plugins-Verzeichnis gestellt haben, müssen Sie nur noch Folgendes tun:

:ConqueTermSplit bash

Und Sie werden eine interaktive Bash-Shell in vim haben. Sie können dann Ihre regulären vim-Gesten verwenden, um alles andere zu tun, was Sie im Fenster tun möchten.

Auch das andere Plugin ist Vimshell .

Bambu
quelle
1
Keine Möglichkeit, so etwas ohne ein Plugin zu tun?
SF.
3
@SF Siehe :help shell-window. (Kurze Antwort: Nein.)
muru
3

Mit VIM glaube ich, dass die Plugins, die dafür zur Verfügung stehen, nicht besonders gut sind, obwohl IMO vimshell am nächsten kommt. Sie müssen jedoch verstehen, dass es sich um ein zweiteiliges Problem handelt.

  1. VIM war nicht dafür ausgelegt, solche Aufgaben auszuführen. Besonders umständlich ist es, lange laufende Aufgaben ausführen und asynchron mit ihnen sprechen zu können, ohne VIM zu blockieren. In diesem Fall handelt es sich nicht nur um die Shell selbst, sondern auch um andere Aufgaben, die Sie möglicherweise innerhalb des Shell-Prozesses ausführen.
  2. Die Modalphilosophie von VIM spielt nicht so gut mit der Art und Weise, wie wir mit einer Shell interagieren. In einer Shell kann nur die aktuelle Zeile bearbeitet werden, obwohl Sie den älteren Text Ihres Verlaufs mit der Shell scrollen und sehen können, können Sie ihn nicht bearbeiten. Dies passt überhaupt nicht zur Philosophie des VIM. Wenn Sie ESC drücken und zum normalen Modus zurückkehren, wird es sehr schwierig, einem Benutzer zu verbieten, Teile des obigen Verlaufs zu bearbeiten.

Meiner Meinung nach gibt es zwei Ansätze, die in dieser Hinsicht viel besser funktionieren.

  1. Verwenden von TMUX / Screen- und Multiplex-Terminalfenstern, um sowohl das VIM als auch die Shell zu haben. Auf diese Weise werden die beiden sauber voneinander getrennt, und dennoch können Sie beide mit sehr geringem Aufwand anzeigen und die beiden können so gut wie möglich arbeiten, ohne in Konflikt mit dem Fluss des anderen zu geraten.
  2. Mit Plugins wie tpope / vim-dispatch und ähnlichen können Sie ganz einfach einmalige Shell-Befehle starten und diese asynchron im Hintergrund in einer tatsächlichen Terminal-Shell ausführen lassen und die Ergebnisse nach Abschluss in vim zurückholen. Dies bietet Ihnen auch das gleiche Maß an Isolation zwischen den beiden, sodass die beiden wieder so gut wie möglich arbeiten können, ohne sich gegenseitig auf die Zehen zu treten.

Ich sollte hinzufügen, dass es sehr wahrscheinlich ist, dass NeoVIM diesen Aspekt ändert, da eines der Hauptziele darin besteht, Jobs asynchron ausführen zu können. Aber bis dahin ist dies das Beste, was wir meiner Meinung nach bekommen können.

Dhruva Sagar
quelle
3

In können :help shell-windowwir über das Ausführen von Shell-Befehlen in einem Fenster lesen:

Es gab Fragen zur Möglichkeit, eine Shell in einem Fenster in Vim auszuführen.

Die Antwort: Sie können nicht!

Das würde Vim viel Code hinzufügen, was ein guter Grund ist, dies nicht zu tun. Schließlich ist Vim ein Editor , der keine nicht bearbeitenden Aufgaben ausführen soll. Um jedoch so etwas zu erhalten, können Sie versuchen, den Terminalbildschirm oder das Anzeigefenster mit dem Programm " splitvt " zu teilen .

Eine Alternative ist der Befehl " window " auf BSD-Unix-Systemen, der mehrere überlappende Fenster unterstützt. Oder das " Bildschirm " -Programm.

Es gibt jedoch nur wenige Lösungen, die Sie verwenden können:

  • Verwendung, screendie speziell für diese Art von Dingen entwickelt wurde, zB:

    • Ctrl+ a, Sum das aktuelle Fenster horizontal zu teilen
    • Ctrl+ a, Tabum zwischen den Fenstern zu wechseln
    • Ctrl+ a, Xum die aktuelle Region zu entfernen
    • Ctrl+ a, Qum alle Regionen bis auf eine zu entfernen

    Weitere Informationen finden Sie unter : GNU Screen Survival Guide bei stackoverflow SE

    Oder: GNU Screen Splitting , Bildschirm-Kurzanleitung für weitere Details.

  • VIM-Shell - ein Patch von Drittanbietern

    Die VIM-Shell ist eine Erweiterung für VIM, die geteilte Fenster enthält. Mit diesem Patch können Shells in diesen Fenstern gestartet werden. Es ist nur für POSIX-Systeme verfügbar

  • vterm - Terminalemulator in vim.

    Das Ziel von vterm ist es, einen Klon des Unix-Terminals in vim bereitzustellen, der ohne Abhängigkeiten funktioniert.

  • Vimux - Interagieren Sie ganz einfach mit tmux von vim aus.

    Inspiriert von tslime.vim , einem Plugin, mit dem Sie Eingaben an tmux senden können, ermöglicht vimux die mühelose Interaktion mit tmux von vim aus.

  • andere schon erwähnt: Conque

Siehe auch: Wie starte ich ein Terminal in vim? bei Stapelüberlauf

Kenorb
quelle
Wie der Split loswerden? : - /
0xc0de
Siehe: GNU Screen Splitting
Kenorb