Bündeln von Befehlssequenzen zur Wiederholung (.)

10

Erwägen:

apple
pear

Setzen Sie den Cursor in die erste Zeile und geben Sie YpFolgendes ein:

apple
apple
pear

Setzen Sie den Cursor auf die pearZeile und geben Sie ein ., um den letzten Befehl zu wiederholen. Dies wiederholt nur das p(und nicht die Kombination Yp) und erzeugt:

apple
apple
pear
apple

Ich möchte eine Möglichkeit finden, .die letzten N Befehle zu wiederholen. So etwas wie 2.die Kombination Ypzu wiederholen , um zu produzieren:

apple
apple
pear
pear

Ofc das wird nicht funktionieren - es wiederholt das pzweimal. Die Idee wäre jedoch, "die Reihenfolge der letzten beiden Befehle zu wiederholen ".

Ich weiß, dass ich qBefehlssequenzen aufzeichnen und wiederholen kann @@, aber diese Lösung ist nicht ideal, da Sie die ganze Zeit im Voraus geplant haben müssen, während Sie in der Praxis oft nicht erkennen, dass Sie etwas erst danach wiederholen müssen Du hast es geschafft.

Gibt es eine Möglichkeit, das zu erreichen, was ich will?

Trostpreis: Wenn dies nicht möglich ist, gibt es eine Möglichkeit, die letzte Makro-Wiedergabe zu wiederholen? Wenn ich beispielsweise @@für die Wiedergabe meines letzten Makros getippt habe, möchte ich, dass das nachfolgende Makro dem erneuten .Tippen entspricht @@- was nicht der Fall ist (z. B. wenn das Ergebnis von @@von der Zeile abhängt, in der Sie sich befinden).

Jona
quelle
Ich kenne keine Lösung für den ersten Teil Ihres Problems, aber für den zweiten Teil können Sie dieses Mapping ausprobieren: Damit nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>es funktioniert, müssen Sie dieses Plugin installieren: github.com/tpope/vim-repeat
user9433424

Antworten:

4

Vim speichert nur den zuletzt ausgeführten Befehl, und nur dieser wird von wiederholt .. Meiner Meinung nach wäre alles andere schwer zu handhaben.

Wenn Sie die YpKombination als einzelne Entität wiederholen möchten, müssen Sie sie zu einem einzigen Befehl machen. Das Repeat.vim-Plugin von Tim Pope ermöglicht dies auf einfache Weise für benutzerdefinierte Zuordnungen. Wenn Sie eine Kurztaste [Sequenz] für das Mapping auswählen, können Sie diese natürlich schnell (anstelle von .) erneut eingeben und sogar die Integration von repeat.vim vermeiden.

Übrigens bietet mein LineJuggler-Plugin eine ]dZuordnung zum Duplizieren der aktuellen Zeile und unterstützt das Wiederholen über repeat.vim.

Ingo Karkat
quelle
2

In Ypist die einzige "Änderung", die wiederholt werden muss p. Die einzige Möglichkeit, das Verhalten .im normalen Modus zu ändern, besteht darin y, die cpoptionsOption zu ergänzen :

set cpoptions+=y

Damit können Sie sowohl den letzten Ruck als auch die letzte Änderung wiederholen.

Aber das ändert nichts an Ihrem Problem, denn es Ypgibt immer noch zwei Befehle: einen Ruck, gefolgt von einer Änderung.

Ich glaube nicht, dass Sie ohne nicht triviales Scripting bekommen können, was Sie wollen. Haben Sie sich den Skriptbereich von vim.org angesehen ?

romainl
quelle
1

Ich benutze häufig map, um diesen Effekt zu erzielen. Zum Beispiel:

map <F12> Yp

Wenn Sie dann F12wiederholt drücken, wird YpYpYpusw. ausgeführt . Wenn Sie nach jedem Einfügen zur nächsten Zeile wechseln möchten, ordnen Sie Yp+stattdessen eine Taste zu .

user112358
quelle
1

Die bemerkenswerte Erfindung, die das RepeatLast- Plugin (von unserem eigenen @joeytwiddle ) ist, bietet genau diese Funktionalität über die unheilige Methode, alles aufzuzeichnen, was Sie als Makro tun.

Es enthält eine Reihe neuer Zuordnungen. Wenn ich jedoch die Dokumentation richtig lese, können Sie zur Durchführung der von Ihnen beschriebenen Änderungen die Befehlsfolge verwenden (vorausgesetzt, Sie verwenden die Standardeinstellung <leader>von \):

  • YpZiehen Sie die Linie und fügen Sie sie ein apple.
  • jBewegen Sie sich eine Zeile nach unten, sodass sich der Cursor jetzt auf der pearZeile befindet.
  • \Dvergiss den jBefehl,
  • 2\.Wiederholen Sie die beiden Befehle Yundp
Reich
quelle
In der Tat unheilig! Aber ich schätze den Ehrgeiz.
Jonah