Hat der Ex-Modus einen praktischen Nutzen?


115

Vim hat einen Ex-Modus, der durch Eingabe eingegeben werden kann Q, und einen Befehlszeilenmodus, der mit eingegeben werden kann q:. Eine häufige Beschwerde unter neuen VIM-Benutzern ist, dass sie diese Modi versehentlich aufrufen, wenn sie versuchen, VIM zu beenden. Als solches deaktiviere ich diese Tasten in meinem ~/.vimrc, um mich davon abzuhalten, sie versehentlich zu treffen (insbesondere q:):

map q: <Nop>
nnoremap Q <nop>

Obwohl ich die Vim-Dokumentation zu Ex gelesen habe , ein mäßig erfahrener Vim-Benutzer bin und die Grundidee dahinter verstehe, habe ich immer noch Schwierigkeiten, eine Verwendung für meinen täglichen Vim-Gebrauch zu finden. Im Allgemeinen scheint es weniger nützlich zu sein, als nur einen Standard-vim-Befehlszeilenbefehl mit vorangestelltem Präfix einzugeben :, da Änderungen nicht sofort übernommen werden.

Hat Ex im modernen Vim einen praktischen Alltag? Gibt es etwas, das im Ex-Modus einfacher zu tun ist als mit Standardbefehlen? Was ist der Unterschied zwischen Kommandozeilenmodus und Ex-Modus?


13
Qund q:sind ganz anders. Sie beziehen sich nur auf Qrichtig?
Jamessan

@jamessan, tatsächlich stellte sich heraus, dass ich nicht sicher war ... du hast recht, sie scheinen verschiedene Dinge zu tun, obwohl ich angenommen hatte, dass sie im Grunde gleich waren. Wenn Sie diese Frage beantworten, kann es hilfreich sein, dies zu klären, da ich offensichtlich verwirrt bin.
Andrew Ferrier

Diese Frage wird auf Meta diskutiert .
200_success

1
@AndrewFerrier Sie haben nach etwas q:speziellem gefragt und es als unter den beiden Schlüsselsequenzen diejenige erwähnt, mit der Sie am meisten Probleme haben. Und zwei der Antworten hier könnten für Leute nützlich sein, die nach dem richtigen Begriff suchen.
Random832

4
Wenn Sie lernen , was q/und zu q:tun, werden Sie wahrscheinlich sie einige der wichtigsten Befehle in Vim betrachten. Und ja, Sie wissen bereits , wie man sie benutzt, Sie wissen nur noch nicht, was sie tun. Sehen Sie sich diesen Screencast an, um es herauszufinden.
Sato Katsura

Antworten:


81

Qist, wie Sie gefunden haben, Ex-Modus. Es ist nicht ganz nützlich, interaktiv zu verwenden, aber es ist vorhanden, weil Vim zum Emulieren der alten exBinärdatei verwendet werden kann. Tatsächlich stellen viele Systeme den exBefehl durch einfaches Verknüpfen mit bereit vim.

q:Oder :<C-f>stellt stattdessen einen Weg , um Ihren Befehlszeilenverlauf zu durchsuchen und es wie ein normaler Puffer zu bearbeiten. Dies erleichtert das Auffinden eines zuvor ausgeführten Befehls, das Bearbeiten mit normalen Vim-Befehlen und das Ausführen des geänderten Befehls. Die q/und q?Befehle existieren , um die gleiche Funktionalität für die Historie der Suche zur Verfügung zu stellen.


64

Vim im Ex-Modus ist nützlich, wenn:

  • Sie müssen (mehrere) Dateien nicht interaktiv (als Teil des Skripts) bearbeiten.
  • Ihre Verbindung ist sehr langsam oder der Bildschirm wird nach Ihren Aktionen nicht aktualisiert.
  • Zuordnungen und Abkürzungen sind deaktiviert.
  • Allgemeine Schlüssel wie Escapeoder Controlfunktionieren nicht richtig.

Grundsätzlich viist der visuelle Modus für den exVim Ex-Modus nur eine Emulation ex(sie führen immer noch den gleichen Code aus), so dass es möglich ist, exvon vi aus in den Befehlsmodus zu gelangen und umgekehrt. Tatsächlich gibt es zwei Modi: Ex-Modus ( vim -e) und verbesserter Ex-Modus, der erweiterte Befehle als der vi-kompatible Ex-Modus ( vim -E) ermöglicht. Siehe: Was ist der Unterschied zwischen dem Ex-Modus und dem verbesserten Ex-Modus?

Ex ist die Wurzel aus einer Familie von Redaktion: edit, exund vi. Ex ist ein Super-Set von ed, wobei die bemerkenswerteste Erweiterung eine Anzeigebearbeitungsfunktion ist. ex (1)

Bearbeiten von Dateien nicht interaktiv ist die am weitesten verbreitete Anwendung und die Menschen es in ähnlicher Weise verwenden , wie sedund awkaber sind sie mehr Strom ausgerichtet sind - sie die Datei nur darauf , von Anfang an lesen zu beenden (sie sind nicht mit mehreren Linien zu arbeiten entworfen ) while vimist pufferorientiert - Sie können sich in der Datei vorwärts und rückwärts bewegen, wie Sie möchten, was sie so leistungsfähig macht.

Grundsätzlich gilt:

sedist ein S tream ED itor, kein Datei-Editor.

Trotzdem scheinen die Leute es zu missbrauchen, weil sie versuchen, Dateien zu bearbeiten, und die Wahrheit ist, dass es keine Dateien bearbeitet. Zweitens handelt es sich bei den Optionen wie in-place ( -i) um nicht standardmäßige FreeBSD-Erweiterungen, die unter anderen Betriebssystemen möglicherweise nicht verfügbar sind. Wenn Sie also nicht portierbaren Code, I / O-Overhead und unerwünschte Nebeneffekte (z. B. das Zerstören von Symlinks) vermeiden möchten, sollten Sie exden standardmäßigen befehlsbasierten UNIX-Editor (zusammen mit BashFAQed ) verwenden .


Andere Dinge, die ich im Ex - Modus nützlich finde, sind, sie als Spielwiese (ähnlich wie eine pythonKonsole) zu verwenden, auf der Sie viele Befehle hintereinander ausführen, reguläre Ausdrücke bearbeiten / debuggen, die vim - Konfiguration überprüfen, externe Befehle ausführen oder mit Registern arbeiten können usw .

Zum Beispiel:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

Das ist im Ex-Modus einfacher als im normalen Modus (wo Sie nur Ihren letzten Befehl sehen können).


Praktische Verwendungen

Ich habe die folgenden Aliase in meinem .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Hinweis: Die Verwendung von bufdoist nicht exPOSIX-konform (wie im Handbuch beschrieben ). Sie können sie also findstattdessen mit verwenden. Das !wird verwendet, um das Umschalten der Puffer ohne Speichern zu erzwingen (andernfalls wird eine Warnung generiert).

Das erste, mit dem ich die nachgestellten Leerzeichen in all meinen Quelldateien abschneide, zB:

trim **/*.php

Der zweite konvertiert alle Tabulatoren in Leerzeichen (rekursiv), zB:

retab **/*.php

Für mich ist das Verwenden retabausreichend, aber es gibt einige Nachteile, die hier beschrieben werden . Fügen Sie Extra -Vfür erhöhte Ausführlichkeitsausgabe hinzu.

Beachten Sie, dass obigen Beispiele mit zsh / bash4 Globbing ( **), so stellen Sie sicher , dass Ihre Shell unterstützt und es aktiviert ist .

Weitere praktische Beispiele (wie das Parsen von HTML-Dateien) finden Sie unter:

Weitere Informationen zum Ex-Modus finden Sie auch unter:


Können Sie sich bitte ein Beispiel für „editing (mehrere Dateien) nicht interaktiv“ Operation , die einfacher zu erreichen mit post exals es mit ist ed, sedoder awk?
Sato Katsura

1
@SatoKatsura Es wurden zwei praktische Verwendungen hinzugefügt, die sich mit mehreren Dateien befassen.
Kenorb

Ich habe die Dokumentation durchgearbeitet, um den exModus besser zu verstehen . Ich verstehe nicht, warum Sie einen Knall ( !) in Ihrem trimAlias- bufdoBefehl haben. Wird das nicht einfach alle Änderungen in allen Dateien außer der letzten aufgeben? Wenn nein, warum nicht?
Wildcard

@Wildcard ohne funktioniert !grundsätzlich nicht, da sich jedes Mal, wenn der Puffer gewechselt wird, exüber nicht gespeicherte Änderungen beschwert (und wir speichern die Änderungen ganz am Ende mit xa). Die Warnung kann deaktiviert werden, das Hinzufügen ist jedoch viel einfacher !.
Kenorb

Ich verstehe ... Ich glaube, ich habe die Dokumentation falsch gelesen. es gibt an, dass ohne die !der Befehl fehlschlägt, wenn der Puffer nicht verzichtet werden kann, aber es gibt nicht ausdrücklich , dass !der Puffer wird dazu führen , nicht verworfen werden .... also, nicht „verlassen“ bedeutet in diesem Fall „fallen gelassen , weil es nichts enthält, was nicht auf die Festplatte geschrieben wurde "? Oder was? (Ich schaue :help bufdo)
Wildcard

18

Ich benutze den Ex-Modus selten, aber wenn ich ihn brauche, bin ich dankbar für seine Existenz.

Ich greife manchmal über ssh über VPN auf Systeme zu, und diese Verbindungen können manchmal langsam werden. Um das Problem zu verschlimmern, muss ich manchmal eine Datei auf der Remote-Seite bearbeiten, die sich nicht nur hinter ssh und VPN befindet, sondern auch über eine langsame serielle Verbindung (also 9600 Baud plus viel Netzwerklatenz).

Es ist eine Zeit wie diese, in der visuelle Rückmeldungen und Bildschirmaktualisierungen eher hinderlich sind, weil das, was ich sehe, verzögert ist (der Effekt ist wie in ein Mikrofon zu sprechen, aber mit weit entfernten Lautsprechern, wie in einem Sportstadion. Die Aktionen werden abgehackt und manchmal durch die verzögerte Rückmeldung verwirrt).

In diesem Fall ist es ein nützlicher Vorteil, wenn die Änderungen nicht zurückgespielt werden, da ich mehr in kürzerer Zeit erledigen kann, wenn ich nicht auf die Aktualisierung des Bildschirms warte.

Wenn ich fertig bin, kehre ich in den visuellen Modus zurück, um eine einmalige Bildschirmaktualisierung durchzuführen und meine Arbeit zu überprüfen. Dann kann ich in den Ex-Modus zurückkehren oder speichern, weil ich fertig bin.


13

Das Befehlszeilenfenster ist nützlich, um lange, komplizierte Befehle zu schreiben. Da der Befehlsverlauf als Fenster geöffnet wird, können Sie alle vim-Navigations- oder Bearbeitungsbefehle / -zuordnungen verwenden.

Angenommen, Sie möchten einen langen Ersetzungsbefehl bearbeiten, den Sie einmal ausgeführt haben, bei dem jedoch ein Fehler aufgetreten ist:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Um den Suchbegriff zu ändern, können Sie keine vim-Bewegungen wie bin der Ex-Zeile zum Navigieren verwenden (obwohl ich glaube, dass es Tastenzuordnungen für diese Navigation gibt). Stattdessen drückten die meisten Leute mehrmals die linke Pfeiltaste.

Ein besserer Weg: Drücken Sie q:, um in das Befehlszeilenfenster kzu gelangen, um zum letzten Befehl zu gelangen und mit normalen Bewegungen zu dem Teil des Befehls zu navigieren, den Sie ändern möchten. Möchten Sie ein ganzes Wort ändern, kein Problem: ciw.


OK danke. Sind Sie sicher, dass q: es sich bei der Ex-Befehlszeile handelt? In der Hilfe wird nur der Ausdruck "Ex" für den von aufgerufenen Modus verwendet. QDies unterstützt jedoch nicht die Standard-VIM-Bearbeitung, auf die Sie sich beziehen. In q:der Hilfe wird lediglich der "Befehlszeilenmodus" aufgerufen. Ich weiß, dass ich die beiden zuerst verwechselt habe, aber wir sollten wahrscheinlich sicherstellen, dass wir uns über die Unterscheidung hier im Klaren sind.
Andrew Ferrier

1
Ich habe gesucht, :help q:bevor ich mich dazu entschlossen habe, diesen Ausdruck zu verwenden, aber ich könnte über die Terminologie verwirrt sein.
bsmith89,

1
Ich war auch verwirrt über diese Terminologie. Normalerweise rede ich davon, einen Ex-Befehl wie folgt einzugeben :, aber ich könnte das falsch verwenden.
bsmith89,

3
Der Inhalt Ihrer Antwort ist korrekt, aber die Art und Weise, wie Sie die Terminologie verwenden, ist (für mich) etwas verwirrend. Ich denke, Sie interpretieren die Dokumentation etwas falsch. q:öffnet keine Ex-Befehlszeile. Es öffnet sich das Befehlsverlaufsfenster , in dem die aktuellen und vorherigen Ex-Befehle bearbeitet werden können. Die Ex-Befehlszeile erhalten Sie, wenn Sie :im normalen Modus drücken .
Rich

3
FWIW Ich denke, die Vim-Dokumentation ist auch ein bisschen verwirrt, da sie an einigen Stellen alle :Befehle als 'Ex'-Befehle bezeichnet. IMHO sollten wirklich nur die Befehle, die tatsächlich in Ex verfügbar sind, als Ex-Befehle betrachtet werden.
Rich

6

Mir wurde von einer Person mit eingeschränktem Sehvermögen, die erblindet, gesagt, dass er zu Ex wechselt. Ich selbst bin wesentlich älter als vi und habe vor langer Zeit von ed auf ex gewechselt (ja, ich weiß, "ed ist der Standardeditor"). Das einzige, was ich im vi-Modus mache, ist% -Hüpfen, um beim Schreiben von Lisp-Code mit den Parens übereinzustimmen.


Erinnert mich an dieses Interview . Ich erinnere mich nicht, ob dies exausdrücklich erwähnt wurde.
Martin Tournoij

Hervorragende Einsicht, daran hätte ich nie gedacht. Vielen Dank, tolle Antwort.
Andrew Ferrier

2

Abgesehen von den hier bereits erwähnten Verwendungen ist ex auch eine Möglichkeit, Dateien auf der Linux-Konsole zu bearbeiten, wenn sich diese auf der S / 390-Plattform befindet und die Konsole zeilenorientiert statt bildschirmorientiert ist.


0

Hat der Ex-Modus einen praktischen Nutzen?

Wahrscheinlich nicht. Während der Eintritt in den Ex-Modus nicht wirklich nützlich ist, ist das Erlernen von Ex-Befehlen dennoch nützlich, insbesondere, weil Sie Ex-Bearbeitungsbefehle mit :g/globalen Befehlen verwenden, um auf übereinstimmenden Zeilen zu arbeiten.


-1

Das ursprüngliche "ex" war die aktualisierte Version des "ed" -Texteditors in Unix. In 2BSD wurde ein visueller Modus hinzugefügt und der neue Editor wurde "vi" genannt.

Will man die ex-Kommandozeile benutzen, wechselt man mit der Taste ":" in den Kommandomodus. Nach meinem besten Verständnis ist Ex eigentlich nicht für Nostalgie da, sondern für den Befehlsmodus.

Sie können den Einfügemodus auch über aufrufen

 :i 

Drücken Sie dann "Enter" und geben Sie Ihren Text ein. Beenden Sie mit ^ c. Oder geben Sie alles in einer Befehlszeile ein, wie

 :i my multiline text \with a second line.^c

1
Da der Ex-Modus nicht ganz mit dem Befehlszeilenmodus identisch ist , scheint dies die Frage nicht zu beantworten. Und als zusätzliche Randnotiz: Der Befehlsmodus ist ein unglückliches Synonym für den Normalmodus und nicht für den Befehlszeilenmodus.
8bittree

"Befehlsmodus" Punkt genommen. Nur eine Entschuldigung, als wir zu vi gewechselt haben, wurden wir als "visuell" (nicht als gegenwärtiger vim visueller Modus) im Gegensatz zu "Befehl" - jetzt ex - eingestuft. Andererseits scheint die Befehlszeile dasselbe do_cmdline () wie ex aufzurufen. Nicht, dass es einen "praktischen Nutzen" vermuten lässt.
if2
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.