Wie kann ich die Vervollständigung des Einfügemodus in einem Makro verwenden?


11

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 lettera`
  • <C-p>Wählen Sie das letzte Element in der Abschlussliste aus, das angezeigt wird. Auf meinem System ist es das Wort arezzo. (Hinweis: Ich habe longestin 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ügemodus
  • j Gehen Sie zur nächsten Zeile und bereit, den gleichen Vorgang in der nächsten Zeile auszuführen
  • q 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 jausgefü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?


Ich verstehe Ihren <C-p>Schritt nicht ... wenn ich das in meinem vim mache, gibt es nur die Meldung back at original- wählt nicht das letzte Element aus. Ich habe zweimal die Pfeiltaste verwendet, um das letzte Wort (meinen Fall azures) auszuwählen , drückte die Eingabetaste und dann Esc+j+q.. es funktioniert dann ganz gut bei der Ausführung von Makro
Sundeep

1
@spasic ah guter Punkt, ich hätte erwähnen sollen, aber ich benutze set completeopt=longest,menuone,previewdie longestOption, die <C-p>zum sofortigen Einfügen führt. Wenn ich longestaus der completeoptZeichenfolge 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)
the_velour_fog

Möglicherweise stört das Popup-Menü. Vielleicht versuchen :set completeopt=und a<c-x><c-k><esc>jals Ihr Makro.
Antony

@Antony Ich bin mir nicht sicher, warum das <Cp> nicht funktioniert hat, aber die Richtungspfeiltasten haben funktioniert.
the_velour_fog

Antworten:


2

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 .vimrcDatei 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 und jzur nächsten Zeile zu gelangen. Ich habe eine Prüfung für die longestOption hinzugefügt. Wenn sie deaktiviert ist, wird ein zufälliger Eintrag unter Verwendung der zufälligen Systemzeit ausgewählt. Wenn die longestOption 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, und 0cwvorne, 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 Sie bcwstattdessen 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.

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

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.


Dies klingt nach einer plausiblen Erklärung des Problems, aber ich habe beide von Ihnen vorgeschlagenen Lösungen ausprobiert, und keine schien zu helfen.
Rich

Haben Sie den sleepBefehl auch ausprobiert ?
Tim

Ja, allerdings nur mit Ihrem empfohlenen Wert von 5 Sekunden. Haben Sie es geschafft, eine der beiden Lösungen zum Laufen zu bringen? Könnten Sie eine vollständige Liste der Schritte veröffentlichen?
Rich

Ich bin nicht die Person, die die Frage geschrieben hat. Ich kann das Problem jedoch reproduzieren: Sie müssen am längsten hinzufügen , completeoptwie in den Kommentaren beschrieben (wieder nicht von mir). edit : Ups, 'longest'ist für den ctrl-pSchritt erforderlich : nicht ctrl-y. Trotzdem funktionieren die vom Fragesteller beschriebenen Schritte für mich vim -Nu NONEmit completeoptbearbeitet.
Rich

Ich glaube, ich habe eine Lösung gefunden. Geben Sie mir ein paar Minuten, um meine Antwort damit zu aktualisieren.
Tim
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.