Gibt es so etwas
eval("is_recording()")
dass ich mein Vimscript aufrufen kann, um herauszufinden, ob ich gerade ein Makro aufzeichne? Ich hätte gedacht, dass das funktioniert:
eval("mode(1)")
aber das kehrt gerade zurück "n"
.
Ich bin mir nicht sicher, ob es wichtig ist, aber ich verwende Neovim. Wenn es also exklusiv für Neovim ist, ist das in Ordnung.
Antworten:
Erstens denke ich, dass Ihr Problem hauptsächlich ein XY-Problem ist . Sie sollten uns am Ende mehr Informationen darüber geben, was Sie versuchen, und ich denke, wir könnten eine andere Lösung finden.
Hier ist eine Problemumgehung. Sie ist wahrscheinlich nicht ideal und sicherlich nicht sehr robust, aber Sie können diese Zeilen zu Ihrer hinzufügen
.vimrc
:Die Idee ist, dass der "Aufnahmemodus" ausschließlich umgeschaltet wird, wenn Sie qim normalen Modus drücken .
Basierend darauf erstellen Sie eine Variable,
g:isRecording
die jedes Mal umgeschaltet wird, wenn Sie eine Aufnahme starten oder stoppen. Auf diese Weise wird beim Starten der Aufnahmeg:isRecording
auf1
und auf0
das Beenden der Aufnahme eingestellt. Sie können dann über den Wert der Variablen auf den Aufzeichnungsstatus zugreifen.Der "Nachteil" ist, dass Sie, um eine rekursive Zuordnung zu vermeiden, Shit-q stattdessen die Aufnahme starten und stoppen müssen q. (Beachten Sie, dass dies kein so großes Problem ist: Ich habe den shift-qAufnahmemodus seit einiger Zeit umgeschaltet, weil mir das ursprüngliche shift-qVerhalten nicht gefällt. )
Das Hauptproblem dieser Lösung besteht darin, dass qdie Variable nicht umgeschaltet wird, wenn Sie sie vergessen und verwendet haben. Sie können sie jedoch nicht deaktivieren q(z. B. mit
nnoremap q <nop>
), da dies sonst shift-qnicht mehr funktioniert.quelle
Dies ist eine ziemlich merkwürdige Anfrage, da es keinen "Modus" zum Aufzeichnen eines Makros gibt. Nachdem ich einige Dokumente durchgesehen hatte, fand ich Folgendes in
usr_10
Das Besondere für mich war die Zeile "Starten Sie die Aufnahme eines Makros in Register a".
Da jedes Makro standardmäßig in einem Register gespeichert wird, hatte ich gehofft, dass wir es in der
:reg
Liste sehen können. Es stellt sich heraus, dass es wie ein Zauber wirkt!Beispiel:
Im normalen Modus:
qaisomething<Esc>
und drinnen sehen
:reg
wir den Eintrag!Mit diesem Wissen sollten Sie in der Lage sein, die Register "auszuspionieren", um zu bestätigen, dass ein Makro aufgezeichnet wird (verwenden Sie bei jeder Aufzeichnung ein benanntes Register [Karte,
q
um immer dasselbe Register zu verwenden (oder so ähnlich)]Wenn Sie auf Probleme stoßen, lassen Sie es mich wissen und ich werde versuchen, Ihnen zu helfen (da diese Funktionalität auch für mich neu ist: D)
Bearbeiten Um das Problem zu lösen, dass ein Register während des Ruckens verwendet wird, würde ich empfehlen, einen speziellen Registertyp zu untersuchen, den Sie nur für das
vimL
Schreiben verwenden können (kein Ruck würde jemals im Register beschäftigt sein ("ay
)).Hier einige Informationen
:help registers
zu den verfügbaren RegisternAngenommen, Sie haben ein Register, das Sie jetzt verwenden werden, lautet das Problem "Woher weiß ich, wann die Aufzeichnung gestoppt wurde?". Zur Pflege dieser ich einen Blick auf die nehmen würde
autocmd-event
fürCursorHold
; Der Hinweis in den Hilfedokumenten sieht ziemlich vielversprechend aus (ich würde versuchen herauszufinden, wie ich den normalen cursorHold von dem inaktiven / nicht vorhandenen Ereignis unterscheiden kann, das auftritt, wenn Ihr Register für die Zwecke des Makros geschrieben wird).quelle
blackhole register
wurde das nur als Hinweis und interessanter vim-Leckerbissen erwähnt, der zu etwas führen könnte (es wäre nicht nützlich, wenn Makros aufgezeichnet werden; da @_ nicht verwendbar ist.). Tatsächlich können Sie nicht einmal versuchen, das Makro zu speichern dazu ..CursorHold
scheint aufgrund der Verzögerung desCursorHold
tatsächlichen Geschehens ein unmöglicher Traum zu sein (machte jedes Mal ein einfaches globales Inkrement, um dies zu beobachten). Immer noch unglaublich interessiert daran, einen Weg zu finden, dies zu tun, und werde mein Gesicht weiter gegen die Schlüssel schlagen, bis wir eine Lösung haben.q
und eine Variable umschalten und die Aufnahme starten / stoppen. Ein Autocomand kann hier nicht zuverlässig sein, da bei einem Tastendruck kein Autocmd ausgelöst wird und es aufgrund der Monothread-Natur von Vim nicht möglich ist, eine Abfragefunktion durchzuführen. Viel Glück bei Ihren zukünftigen Experimenten :-)