Vim: Wie Zeilenumbrüche zu handhaben, wenn mehrere Befehle in den Registern zu speichern?

StackOverflow https://stackoverflow.com/questions/2730922

  •  02-10-2019
  •  | 
  •  

Frage

Ich habe eine Datei, wo ich Schnipsel von vim Befehle speichern. Wenn ich einen Schnipsel benötigen, zerren ich es und es dann mit @" auszuführen. Die Schnipsel werden als Skript gespeichert ist, eine Zeile pro Befehl wie folgt aus:

:s/foo/bar/g
:echo "hello"
:s/1/2/g

Edit: Ich entfernte Normalmodus Befehle aus dem Beispiel, da sie nicht Teil des Problems waren

.

Nun ist dieses Verfahren nicht mehr funktioniert: wenn das Snippet ausgeführt wird, es hält nur in der ersten Zeile, als ob für eine neue Zeile zu warten.

Gibt es eine Möglichkeit, irgendwo zu beeinflussen, wie @ ausgeführt wird? Ich bin ziemlich sicher, es wurde vor einiger Zeit arbeiten ...

Setzt man den Newline mit ^ M Zeichen funktioniert, aber macht die Datei schwieriger zu handhaben.


Weitere Informationen:

Hier ist ein weiteres Symptom: Wenn ich einen Schnipsel reißen, wenn ich es mit @" ausführen hält es in der ersten Zeile, wie ich gerade erklärt. Aber wenn ich es mit :@ ausführen es funktioniert. Aber die Hilfe-Datei scheint nicht in einen Unterschied zu implizieren, wie die beiden Befehle des Registers Inhalt behandeln ...

War es hilfreich?

Lösung 2

Ich fand schließlich die Täter. Irgendwie hatte ich einen Befehl Mapping auf <C-J> in meiner .vimrc Datei. Wenn es mit dem Standard cpoptions lesen, diese in ein Mapping auf <NL> gedreht.

Wie ich herausgefunden habe: Ich habe bemerkt, dass, wenn vim beginnend mit -u ~/.vimrc, wäre es in der Tat zerrte Schnipsel auszuführen. I erzeugt eine Session-Datei mit und ohne dass die Kommandozeilenoption und sie verglichen. Auf diese Weise fand ich heraus, dass ein anderer Satz von cpoptions verwendet, bei denen die gleichen .vimrc-Datei zu lesen, dass so in einem Fall die Zuordnung in die Tat auf <C-J> war, in dem anderes in ein Mapping auf <NL> umgewandelt wurde!

Wenn jemand ein ähnliches Problem hat, schlage ich auf den aktuell eingestellten Befehlszuordnungen genau hinschauen, mit :cmap.

Andere Tipps

Ich glaube nicht, das Problem ist ^M vs. ^J. Vim-Makros wird entweder eine als gültiges End-of-line-Zeichen für aufgezeichneten Makros behandeln. Ich denke, das Problem zusätzliche Zeilenumbrüche ist.

In Ihrem Beispiel, gibt es zumindest eine unechte Newline nach 2j, und es sei denn, Sie besonders vorsichtig sind, wenn das Snippet zu kopieren, gibt es wahrscheinlich eine andere nach 10k auch. Diese zusätzlichen Zeilenumbrüche sind wie Pressen <Enter> im Normal-Modus -. Sie den Cursor eine Zeile nach unten bewegen

Hier ist, was ich denke, Sie das Snippet aussehen wollen wie:

:s/foo/bar/g
2j:s/1/2/g
10k

(Auch das ist ein wenig irreführend -. Sie würden immer noch vorsichtig sein müssen, um nicht die Newline nach dem 10k zu kopieren)

Warum diese zusätzlichen Zeilenumbrüche machen einen so großen Unterschied? Nun, für eine Sache, sie führen, dass Sie zumindest eine Linie weg sein von wo Sie zu sein erwarten, die aus etwas wirft man auf einer bestimmten Linie tun wollen (wie führen Sie den :s// Befehl).

Noch wichtiger ist, aber - und das ist, was ich denke, ist in Ihrem Beispiel passiert - ist, dass Vim Makro-Wiedergabe, wenn der Makro versucht, zu verwenden <Enter> stoppt in der letzten Zeile eines Puffers. (Ich vermute, Vim es einen Fehler hält, und jeder Fehler führt zu einem Makro ausgeführt zu stoppen.)

Hier ist ein Beispiel. Angenommen, Sie haben diese Schnipsel im Register gespeichert bekommen x:

4j
:echo "Done"

(Beachten Sie die Newline nach 4j.)

Darüber hinaus nehme an, Sie die folgenden fünf Zeilen (und nur diese fünf Zeilen) in einem Puffer:

line 1
line 2
line 3
line 4
line 5

Wenn Sie jetzt drücken @x auf line 1, die :echo "Done" niemals ausgeführt. Vim bewegt den Cursor nach unten 4 Zeilen zu line 5, dann versucht man wegen der zusätzlichen Newline mehr Linie nach unten zu bewegen, aber es kann nicht. Die Makro stoppt an diesem Punkt ausgeführt wird, bevor der Befehl :echo eine Chance laufen wird.

Allerdings funktioniert es, wenn Sie die x ändern, um diese zu registrieren:

4j:echo "Done"

So zu Ihrem ursprünglichen Beispiel zurückzukehren, ich wette, was passiert, ist, dass die zusätzlichen Newline nach 2j versucht, die Cursor irgendwo bewegen kann es nicht gehen, und das bewirkt, dass das Makro zu stoppen. Die unterste Zeile des Bildschirms enthält den letzten Befehl ausgeführt (:s/foo/bar/g), das macht es so aussehen wie Vim für Sie zu drücken Sie die Eingabetaste wartet.

Schließlich würde ich empfehlen, eine andere Methode unter Verwendung von Vim Befehlssequenzen zu speichern und auszuführen. Die Technik, die Sie verwenden ist erträglich für einfache Fälle, aber es ist zerbrechlich und nicht gut skalieren. Vim hat eine vollständige Skriptsprache, die Funktionen und benutzerdefinierte Befehle enthält, und es kann verwendet werden, um alle Dinge zu tun, jetzt Sie tun, aber in einer viel robustere Art und Weise. Vim Scripting ist ein großes Thema, aber ich würde hier beginnen:

:help script

Achten Sie darauf, über den :normal Befehl zu lesen, die Sie Normal-Mode-Befehle (wie 2j und 10k) kann ausgeführt werden innerhalb von Skripten.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top