Czy istnieje sposób na wykrycie, czy nagrywam w vimscript?

11

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.

James
źródło
3
IMHO to byłby zły pomysł - w takim przypadku „nagrywanie” stałoby się fałszywym imieniem :) Nie wiem, co próbujesz zrobić, ale może zadawanie tego pytania może zapewnić różne sposoby rozwiązania tego problemu.
VanLaser
@VanLaser Co rozumiesz przez fałszywe imię?
James
1
Jeśli akcja Vima jest inna, gdy ją nagrywasz, oznacza to, że sam proces nagrywania wpływa na akcję, kiedy powinna ona tylko „zapisać” ją do późniejszego powtórzenia. Co spodziewasz się po uruchomieniu makra?
VanLaser

Odpowiedzi:

4

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:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

Chodzi o to, że „tryb nagrywania” przełączany jest wyłącznie po naciśnięciu qw trybie normalnym.

Na tej podstawie tworzysz zmienną, g:isRecordingktóra będzie przełączana przy każdym uruchomieniu lub zatrzymaniu nagrywania. W ten sposób po rozpoczęciu nagrywania g:isRecordingzostanie ustawione na 1i 0po 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ć.

statox
źródło
2

To dość ciekawa prośba, ponieważ nie ma „trybu” nagrywania makra. Po przejrzeniu niektórych dokumentów znalazłem następujące wusr_10

Zaczynasz od przejścia do pierwszego znaku pierwszego wiersza. Następnie wykonaj następujące polecenia:

qa Rozpocznij rejestrowanie makra w rejestrze a .

^ Przejdź na początek linii.

i # include „Wstaw ciąg #include” na początku wiersza.

$ Przejdź na koniec linii.

a „Dołącz znak podwójnego cudzysłowu (”) na końcu wiersza.

j Przejdź do następnego wiersza.

q Zatrzymaj rejestrowanie makra.

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 :regliście. Okazuje się, że działa jak urok!

Przykład:

W trybie normalnym: qaisomething<Esc>

a wewnątrz :regwidzimy wpis!

"a   isomething^[

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, qaby 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 vimLpisania (żaden szarpnięcie nigdy nie będzie zaangażowane w rejestrze ( "ay))

Oto trochę informacji :help registersna temat dostępnych rejestrów

Istnieje dziesięć rodzajów rejestrów: rejestry E354

  1. Rejestr nienazwany „”

  2. 10 numerowanych rejestrów „0 do” 9

  3. Mały skasowany rejestr ”-

  4. 26 nazwanych rejestrów „a” na „z” lub „A na” Z

  5. trzy rejestry tylko do odczytu „:,”., „%

  6. alternatywny rejestr bufora "#

  7. rejestr wyrażeń "=

  8. Selekcja i upuszczanie rejestruje „*”, „+” i „~”

  9. Rejestr czarnej dziury "_

  10. Rejestr wzorca ostatniego wyszukiwania "/

Zakł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-eventdla CursorHold; 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)

CursorHold

Gdy użytkownik nie naciska klawisza przez czas określony w parametrze „updatetime”. Nie jest uruchamiany ponownie, dopóki użytkownik nie naciśnie klawisza (tzn. Nie uruchamia się co ms przez aktualizację, jeśli zostawisz Vima, aby zrobić kawę. :) Zobacz | CursorHold-example | do podglądu tagów. To zdarzenie jest uruchamiane tylko w trybie normalnym. Nie jest wyzwalany podczas oczekiwania na wpisanie argumentu polecenia lub ruch po operatorze. Podczas nagrywania zdarzenie CursorHold nie jest wyzwalane. | q |

Dan Bradbury
źródło
Naprawdę nie rozumiem, jak to rozwiązuje problem: po zakończeniu rejestrowania makra ciąg jest zapisywany w rejestrze, ale jak odróżnić, kiedy rejestr zawiera makro lub gdy zawiera coś pochodzącego na przykład z polecenia yank. Rejestr jest również zapisywany jako jeden strzał po zakończeniu nagrywania, więc gdy zobaczysz, że zawartość rejestru się zmieniła, nie jesteś już w trybie nagrywania.
statox
Mam nadzieję, że będziesz w stanie użyć czegoś takiego jak rejestr blackhole (rejestr, który nigdy nie będzie szarpany). Jeśli masz ten rejestr zablokowany, możesz sprawdzić CursorHold, który ma jakieś specjalne zachowanie w trybie nagrywania (zaktualizuje moją odpowiedź o kilka dodatkowych informacji, aby zobaczyć, czy to ci pomoże)
Dan Bradbury
dodano informacje o innych rejestrach (sposób na uniknięcie konfliktu z yank) oraz podpowiedź, w jaki sposób możemy złapać „nagrywanie”, gdy CursorHold nie jest aktywny podczas rejestrowania makr. Jeśli nadal walczysz z tym po tych notatkach, daj mi znać, a mogę spróbować wdrożyć to po zakończeniu pracy. Jako notatkę blackhole registerwspomniano 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 ..
Dan Bradbury
Ostatniej nocy spędziłem trochę czasu (rozbijanie klawiatury po piwie) i stwierdziłem, że niezwykle trudno jest dokładnie ustalić, kiedy nagrywanie się kończy i kończy. Moje przeczucie CursorHoldwydaje 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.
Dan Bradbury
Moim zdaniem nie masz tysiąca różnych opcji: musisz przesłonić zachowanie qi 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 :-)
statox