Was macht: open do in vim?

18

Die Dokumentation von Vim enthält folgende Informationen zum :openBefehl:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

Es wird nicht auf die Art der "Simulation" eingegangen, und warum dies eher als Simulation denn als echter Befehl mit unterschiedlichem Verhalten angesehen wird. Im Ex-Modus (Q) verhält es sich tatsächlich wie beschrieben.

Es scheint jedoch auch einen anderen Öffnungsbefehl zu geben. Bei Ausführung über die normale Befehlszeile oder im Ex-Modus mit unterschiedlichen Argumenten scheint dies ein Synonym für zu sein :edit. Wenn aus dem Befehlsmodus mit a ausgeführt wird /pattern/, wird der Cursor positioniert und anscheinend ausgeführt :edit(wobei die Cursorposition nur ersichtlich ist, wenn: edit failed.). Es kann auch ausgeführt werden als :open /pattern/ file, wodurch der Cursor positioniert und ausgeführt wird:edit file

Meine Frage ist: Warum ist das nicht dokumentiert? Gibt es irgendwelche Unterschiede :edit, die ich nicht bemerke? War es :openeinmal ein Synonym für :editund wurde es erst später geändert, um die Anforderungen von POSIX zu erfüllen?

Random832
quelle

Antworten:

13

Der "offene Modus" von vi war nützlich für Terminals, die eine einzige Leitung hatten, wie beispielsweise Hardcopy-Terminals. Im offenen Modus hatte vi eine "einzeilige Ansicht" der Datei. Wenn Sie den Mauszeiger bewegen, wird die gesamte Zeile neu gezeichnet und Zeichen werden anders gedruckt.

Die „Simulation“ , dass vim macht einfach ist das Kommando unterstützt, so dass es handeln (wie die Dokumentation sagt) wie :visualund da :visualist „sonst wie :edit,“ das wahrscheinlich ist , warum Sie es sehen handeln wie :edit.

Aus Sicht des Quellcodes :openist dies in ex_docmd.c( ex_open()) implementiert . Es unternimmt einige Dinge, um den Fall zu behandeln, in dem ein regulärer Ausdruck bereitgestellt wird, endet jedoch immer mit einem Aufruf von do_exedit().

Die Umsetzung :edit, :baddund :visualist in der enthaltenen ex_edit()Funktion in der gleichen Datei, und diese Funktion ist ein direkter Aufruf an do_exedit()(sonst nichts). Anders als beim Behandeln des Parameters für reguläre Ausdrücke wird daher derselbe Code aufgerufen. do_exedit()ist ein bisschen haarig, und sein Verhalten wird stark auf der Grundlage des tatsächlichen Befehls geändert, der ausgegeben wurde, aber es wird nie explizit nach Befehlstoken für Öffnen / Bearbeiten / Visuell gesucht. Somit führen die drei Befehle dazu, dass mehr oder weniger derselbe Code ausgeführt wird do_exedit().


quelle
8

Von einer Einführung in die Anzeigebearbeitung mit Vi :

Wenn Sie sich auf einem Hardcopy-Terminal oder einem Terminal befinden, das keinen Cursor hat, der von der unteren Zeile abweicht, können Sie den Befehlssatz von vi weiterhin verwenden, jedoch in einem anderen Modus. Wenn Sie einen vi-Befehl eingeben, teilt der Editor Ihnen mit, dass der offene Modus verwendet wird. Dieser Name stammt aus dem Befehl open in ex, mit dem in denselben Modus gewechselt wird.

Der einzige Unterschied zwischen dem visuellen Modus und dem geöffneten Modus besteht in der Art und Weise, in der der Text angezeigt wird.

Im geöffneten Modus verwendet der Editor ein Fenster mit einer einzelnen Zeile in der Datei. Wenn Sie sich in der Datei vorwärts und rückwärts bewegen, werden neue Zeilen immer unterhalb der aktuellen Zeile angezeigt. Zwei Befehle von vi funktionieren in open unterschiedlich: z und ^ R. Der Befehl z verwendet keine Parameter, sondern zeichnet ein Kontextfenster um die aktuelle Zeile und kehrt dann zur aktuellen Zeile zurück.

Wenn Sie sich in einem Hardcopy-Terminal befinden, gibt der Befehl ^ R die aktuelle Zeile erneut ein. Auf solchen Terminals verwendet der Editor normalerweise zwei Zeilen, um die aktuelle Zeile darzustellen. Die erste Zeile ist eine Kopie der Zeile, mit deren Bearbeitung Sie begonnen haben, und Sie arbeiten an der Zeile unterhalb dieser Zeile. Wenn Sie Zeichen löschen, gibt der Editor eine Reihe von Zeichen ein, um die Zeichen anzuzeigen, die gelöscht werden. Der Editor druckt die aktuelle Zeile auch kurz nach solchen Änderungen erneut, sodass Sie sehen können, wie die Zeile wieder aussieht.

Es ist manchmal nützlich, diesen Modus auf sehr langsamen Terminals zu verwenden, die vi im Vollbildmodus unterstützen können. Sie können dies tun, indem Sie ex eingeben und einen offenen Befehl verwenden.

:openist ein Artefakt von Vims Ursprung als Vi-Klon, das heute völlig unbrauchbar ist. Ich kann nur davon ausgehen, dass es dort aus Gründen der POSIX-Kompatibilität bleibt.

Trotz der vagen Ähnlichkeiten :openist dies keine Alternative zu :editeiner größeren Vorstellungskraft.

romainl
quelle