Ich versuche, ein Makro zu definieren, das schnell eine Liste zufälliger Wörter generiert.
Ich möchte, dass das Makro daraus eine Liste wie macht
a
b
c
d
e
das mögen
arezzo
bywords
czars
détente
eyrie
Was ich bisher habe:
- Setzen Sie den Cursor auf den Buchstaben
a
- Starten Sie die Aufnahme des Makros
qq
a
Aktivieren Sie den Einfügemodus<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter
a`<C-p>
Wählen Sie das letzte Element in der Abschlussliste aus, das angezeigt wird. Auf meinem System ist es das Wortarezzo
. (Hinweis: Ich habelongest
in meine'completeopt'
Einstellung aufgenommen, die erforderlich ist, um<C-p>
während der Fertigstellung auf diese Weise zu arbeiten :)'set completeopt=longest,menuone,preview'
.<C-y>
Akzeptiere den Abschluss^[^[
Beenden Sie den Einfügemodusj
Gehen Sie zur nächsten Zeile und bereit, den gleichen Vorgang in der nächsten Zeile auszuführenq
höre auf, aufzunehmen
Wenn ich das Makro erstelle und die Schritte manuell durchführe, funktioniert alles einwandfrei. Wenn ich das Makro jedoch ausführe, blinkt in der Befehlszeile eine Meldung wie:
Scannen der Wörterbuchdatei
und nichts passiert, von den Befehlen im Makro wird nur j
ausgeführt, dh der Cursor bewegt sich die Zeile entlang, aber keiner der Abschlussbefehle wird ausgeführt.
Ist es möglich, Vervollständigungen des Einfügemodus in einem Makro zu verwenden, und wenn ja, wie kann ich das tun?
autocompletion
macro
the_velour_fog
quelle
quelle
<C-p>
Schritt nicht ... wenn ich das in meinem vim mache, gibt es nur die Meldungback at original
- wählt nicht das letzte Element aus. Ich habe zweimal die Pfeiltaste verwendet, um das letzte Wort (meinen Fallazures
) auszuwählen , drückte die Eingabetaste und dannEsc+j+q
.. es funktioniert dann ganz gut bei der Ausführung von Makroset completeopt=longest,menuone,preview
dielongest
Option, die<C-p>
zum sofortigen Einfügen führt. Wenn ichlongest
aus dercompleteopt
Zeichenfolge entferne , erhalte ich das gleiche Verhalten wie Sie. Auch ja die Pfeiltasten haben funktioniert! danke (ich habe vergessen, dass Sie sie verwenden können, um in der Abschlussliste zu navigieren):set completeopt=
unda<c-x><c-k><esc>j
als Ihr Makro.Antworten:
EDIT : Wirklich sind Sie nach Abschluss des Wörterbuchs; Dazu benötigen Sie nicht unbedingt den Einfügemodus (Strg + X-Modus). Wie Sie festgestellt haben, ist die Arbeit mit Makros ein echtes Problem. Das folgende Skript kann verwendet werden, um das Wörterbuch ohne Einfügemodus zu vervollständigen, sodass Sie es problemlos innerhalb eines Makros wiederholen können.
Fügen Sie den folgenden Code zu Ihrer
.vimrc
Datei hinzu, schließen Sie alle vim-Fenster und öffnen Sie sie erneut , um die neue Funktion zu erhalten. Zeichnen Sie dann abwechselnd<C-k>
auf, um den Vorgang abzuschließen undj
zur nächsten Zeile zu gelangen. Ich habe eine Prüfung für dielongest
Option hinzugefügt. Wenn sie deaktiviert ist, wird ein zufälliger Eintrag unter Verwendung der zufälligen Systemzeit ausgewählt. Wenn dielongest
Option gefunden wird, wird manuell nach dem längsten übereinstimmenden Eintrag aus dem Wörterbuch gesucht und dieser eingefügt.Wenn Ihnen das
<C-k>
Mapping nicht gefällt , können Sie es nach Belieben ändern. Es sollte mit jedem Mapping funktionieren, das Sie mögen.Außerdem fügt der Befehl zum Zurückgeben des Ausdrucks für die auszuwertende Zuordnung
\<esc>
am Ende ein Zeichen hinzu, sodass wir den Einfügemodus nach jeder Einfügung automatisch verlassen, und0cw
vorne, um zunächst in den Einfügemodus zu wechseln und sicherzustellen, dass das gesamte Wort überschrieben wird korrekt. Abhängig von dem genauen Verhalten, das Sie möchten (wenn Ihre Wörter nicht gut vor jeder Zeile stehen), können Siebcw
stattdessen den tatsächlichen Wortanfang ermitteln. Dann werden Sie jedoch einige Kuriositäten feststellen, wenn Sie zu Wörtern zurückkehren, die die Zeile beginnen. Es gibt wahrscheinlich einen erweiterten Befehl, um das Zeilenende zu ignorieren und beides gleichzeitig zu tun, aber ich konnte keinen finden.Darüber hinaus wäre es nicht schwierig, die Logik hier zu erweitern, um alternative Zuordnungen (beispielsweise unter Verwendung von Funktionsparametern) zu erstellen, die eine Funktion ausführen, die der Einfügemodus bereitstellt. Ich helfe Ihnen gerne bei solchen Anforderungen und aktualisiere dieses Skript, sobald ich Zeit habe.
quelle
sleep
Befehl auch ausprobiert ?completeopt
wie in den Kommentaren beschrieben (wieder nicht von mir). edit : Ups,'longest'
ist für denctrl-p
Schritt erforderlich : nichtctrl-y
. Trotzdem funktionieren die vom Fragesteller beschriebenen Schritte für michvim -Nu NONE
mitcompleteopt
bearbeitet.