Czy jest coś takiego?
eval("is_recording()")
że mogę zadzwonić do vimscript, aby dowiedzieć się, czy aktualnie nagrywam makro? Myślałem, że to zadziała:
eval("mode(1)")
ale to po prostu powraca "n"
.
Nie jestem pewien, czy to ważne, ale używam neovim, więc jeśli jest to wyłączne dla neovim, to w porządku.
Odpowiedzi:
Po pierwsze, myślę, że twój problem dotyczy głównie XY . Powinieneś dać nam więcej informacji o tym, co próbujesz zrobić w końcu i myślę, że możemy znaleźć inne rozwiązanie.
Oto obejście tego problemu, prawdopodobnie nie jest idealne i na pewno niezbyt solidne, ale możesz dodać te linie do swojego
.vimrc
:Chodzi o to, że „tryb nagrywania” przełączany jest wyłącznie po naciśnięciu qw trybie normalnym.
Na tej podstawie tworzysz zmienną,
g:isRecording
która będzie przełączana przy każdym uruchomieniu lub zatrzymaniu nagrywania. W ten sposób po rozpoczęciu nagrywaniag:isRecording
zostanie ustawione na1
i0
po zakończeniu nagrywania. Następnie można uzyskać dostęp do stanu rejestracji za pomocą wartości zmiennej.„Wadą” jest to, że aby uniknąć mapowania rekurencyjnego, musisz Shit-q zamiast tego rozpocząć lub zatrzymać nagrywanie q. (Pamiętaj, że nie jest to taki duży problem: shift-qod pewnego czasu przełączam tryb nagrywania, ponieważ nie lubię oryginalnego shift-qzachowania)
Głównym problemem tego rozwiązania jest to, że jeśli o nim zapomnisz i użyjesz qzmiennej, nie zostanie ona przełączona, ale nie będziesz mógł jej wyłączyć q(np. Za pomocą
nnoremap q <nop>
), ponieważ jeśli to zrobisz shift-q, nie będzie już działać.źródło
To dość ciekawa prośba, ponieważ nie ma „trybu” nagrywania makra. Po przejrzeniu niektórych dokumentów znalazłem następujące w
usr_10
Cechą wyróżniającą mnie było zdanie o „Rozpocznij rejestrowanie makra w rejestrze a”
Ponieważ każde makro będzie domyślnie zapisywane w rejestrze, miałem nadzieję, że będziemy w stanie zobaczyć je na
:reg
liście. Okazuje się, że działa jak urok!Przykład:
W trybie normalnym:
qaisomething<Esc>
a wewnątrz
:reg
widzimy wpis!Mając tę wiedzę, powinieneś być w stanie „szpiegować” rejestry, aby potwierdzić, że makro jest rejestrowane (użyj nazwanego rejestru na każdym nagraniu [mapa,
q
aby zawsze używać tego samego rejestru (lub czegoś podobnego)]Jeśli napotkasz problemy, daj mi znać, a ja postaram się Ci pomóc (ponieważ ta funkcja jest dla mnie również nowa: D)
edytuj Aby rozwiązać problem z rejestrem używanym podczas szarpnięcia, polecam przyjrzeć się specjalnemu rodzajowi rejestru, którego można użyć tylko do
vimL
pisania (żaden szarpnięcie nigdy nie będzie zaangażowane w rejestrze ("ay
))Oto trochę informacji
:help registers
na temat dostępnych rejestrówZakładając, że masz rejestr, którego będziesz teraz używać, problem brzmi „skąd mam wiedzieć, kiedy nagrywanie zostało zatrzymane?”. Dbać o to bym spojrzeć Pod
autocmd-event
dlaCursorHold
; notatka w dokumentach pomocy wygląda dość obiecująco (postaram się dowiedzieć, jak odróżnić normalny wskaźnik zatrzymania kursora od nieużywanego / nieistniejącego zdarzenia, które pojawia się, gdy rejestr jest zapisywany na potrzeby makra)źródło
blackhole register
wspomniano tylko jako podpowiedź i ciekawą ciekawostkę vima, która może do czegoś doprowadzić (nie przydałoby się to podczas nagrywania makr; ponieważ @_ nie jest użyteczny.) W rzeczywistości nie można nawet zapisać makra do tego ..CursorHold
wydaje się być niemożliwym snem ze względu na opóźnienie tego, co sięCursorHold
faktycznie dzieje (zrobiłem prosty globalny przyrost za każdym razem, gdy to oglądam). Nadal jestem bardzo zainteresowany wymyśleniem sposobu na zrobienie tego i będę nadal walił moją twarz kluczami, dopóki nie znajdziemy rozwiązania.q
i ustawić zmienną oraz rozpocząć / zatrzymać nagrywanie. Autocomand nie może być tutaj niezawodny, ponieważ żaden klawisz autocmd nie uruchamia się po naciśnięciu klawisza i nie jest możliwe wykonanie funkcji odpytywania ze względu na monotematyczną naturę Vima. Powodzenia w przyszłych eksperymentach :-)