Jak zatrzymać nagrywanie w wierszu poleceń?

19

Kiedy nagrywam makro qi gotowe, mogę wpisać:

  • q aby zatrzymać nagrywanie, jeśli jestem w trybie normalnym lub wizualnym.
  • <c-o>q aby zatrzymać nagrywanie, jeśli jestem w trybie wstawiania.
  • ..

    Jak zatrzymać nagrywanie, jeśli moje makro kończy się w trybie poleceń?

iago-lito
źródło
Jaki jest twój przypadek użycia tego? Jestem naprawdę ciekawy :)
PhilippFrank,
2
@PhilippFrank Często wyszukuję i zastępuję ten sam wzór różnymi wzorami w różnych blokach tekstu. Przy takim makrze wybranie bloku, napisanie aktualnego wzorca wyszukiwania i umieszczenie kursora na dobrej pozycji do wpisania łańcucha zastępczego może być wykonane automatycznie. Kiedy gram, wybierze blok, wejdzie w tryb poleceń, napisze , :'<,'>s/toBeReplaced//ga następnie umieści kursor między nimi //, aby wszystko, co musiałem zrobić, to pisać newString<cr>i gotowe. :)
iago-lito
To jest jak makro z parametrem. Bardzo fajny pomysł, dziękuję!
PhilippFrank
@PhilippFrank rodzaj, tak. Cieszę się że ci się podoba. :)
iago-lito

Odpowiedzi:

12

Innym rozwiązaniem jest przejście do trybu wiersza poleceń za pomocą Ctrl-fi naciśnij, qaby zatrzymać nagrywanie.

Ctrl-fpozwala otworzyć okno wiersza poleceń, w którym możesz edytować polecenie w trybie normalnym. Aby zatwierdzić polecenie, po prostu użyj enter.


Dlatego po dodaniu czegoś takiego:

cnoremap <c-q> <c-f>i<c-o>q

w twoim .vimrcmożesz użyć, <c-q>aby zatrzymać nagrywanie makra w trybie poleceń.


Florent

flflorent
źródło
Nadal musisz usunąć znak <Cf> ( ^F) z końca makra, prawda? Przynajmniej tak widzę.
VanLaser,
Prawie na miejscu! Naprawdę przydatne (nie wiedziałem o oknie wiersza poleceń, ale jest świetne), ale .. aargh! Wygląda na to, że wejście w to okno z trybu wstawiania powoduje utratę wybranego obszaru. Czy istnieje sposób, aby polecenie uruchamiane z okna wiersza polecenia działało na wybranym obszarze?
iago-lito
@ VanLaser Nie, ponieważ możesz kontynuować wpisywanie polecenia w oknie wiersza polecenia. Twoje makro będzie podobne, qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qwięc nagrywanie faktycznie się zatrzymało podczas pisania komendy. Aby użyć makra: @qFINISHYOURCOMMAND<cr>i gotowe: nie trzeba go edytować. Niestety nie wydaje się, aby działało to w trybie wizualnym (lub gubi wybór) .. lub czy coś przeoczyłem?
iago-lito
Ach, racja :) BTW, mogłem wybrać zakres wizualny, a następnie zrobić @qi zakres został dodany na początku polecenia '<,'>- dopóki makro zaczęło się od :...
VanLaser
@ lago-lito W rzeczywistości wygląda na to, że nawet jeśli nie widzisz swojego wyboru, określony zakres (tj. '<,'>) nadal pasuje do wyboru podczas sprawdzania poprawności polecenia.
fflorent
17

Jednym ze sposobów na to:

  • uruchom makro jak zwykle (np. qq... inne znaki)
  • po osiągnięciu trybu cmdline napisz wszystkie potrzebne znaki
  • chcesz zakończyć makro tutaj. Naciśnij, ESCaby wyjść z trybu cmdline, qaby zakończyć makro.
  • usuń ESCz qrejestru (*): możesz wkleić go do bufora, usunąć ^[postać, ponownie zaznaczyć całą zawartość (pod względem znaków) i pociągnąć ją z powrotem, aby się zarejestrować q.
  • to jest to: uruchomić makro: @q.

Zasadniczo trochę „przetwarzasz” swoje makro, ponieważ jest ono przechowywane w rejestrze :)

(*) Szybkim sposobem na usunięcie ostatniego znaku z makra przechowywanego w rejestrze qbyłoby:

:let @q = @q[:-2]
VanLaser
źródło
Ha ha! To był mój hack do tej pory = D. Czy nie ma takiego „kanonicznego” sposobu? (także szybciej )
iago-lito
Nie znam żadnego z nich, ale nie używam zbyt wiele makr (wolę pisać małe funkcje). Makra czują się dla mnie tajemniczo, kiedy patrzę na nie później.
VanLaser
@ VanLaser: czy mógłbyś podać trochę więcej szczegółów na temat linii :let @q = @q[:-2]? Zwłaszcza jak [:-2]działa? :-)
statox
To „krojenie” i działa na listach i ciągach (tak właśnie uzyskiwałem dostęp / ustawiałem @qpowyżej). Kilka przykładów tutaj
VanLaser
@VanLaser naprawdę wyglądają tajemniczo. Przydają się jednak powtarzające się, wyrafinowane małe rzeczy, które musisz robić w bardzo szczególnych przypadkach. Znasz tego rodzaju problemy, które pojawiają się tylko raz i trwają tylko kilka minut. Możliwość radzenia sobie z nimi poprzez tworzenie makr w locie, bez konieczności pisania i debugowania dedykowanej funkcji jest po prostu ... woo taka cudowna! ^ ^
iago-lito
3

Po przeczytaniu komentarza dotyczącego przypadku użycia wygląda na to, że można użyć mapowania klucza zamiast makra.

Mam ten wiersz w moim .vimrc (nie pamiętam, gdzie go znalazłem):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Ma podobny efekt do opisanego przypadku użycia, umieszczając cię w wierszu polecenia, więc jedyne, co musisz zrobić, to wpisać zamianę i nacisnąć Enter, ale w tym przypadku zastępuje wszystkie wystąpienia słowa pod kursorem .

Aby po prostu zastąpić w bieżącym bloku, myślę, że powinno działać coś takiego:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Oczywiście możesz przypisać go do dowolnego klucza, jaki chcesz.

Co robi powyższe: zaznacz bieżącą pozycję za pomocą nienazwanego znacznika, wizualnie wybierz bieżący blok, wyjdź z trybu wizualnego i przywróć kursor do zapisanej pozycji (wizualne znaczniki wyboru są nadal ustawione), wejdź w tryb polecenia i wpisz polecenie zastępcze , wstawiając słowo pod kursorem <C-r><C-w>i ustawiając kursor, aby wpisać zamianę.

dhakimian
źródło
Tak, ja też to mam. Jednak w moim konkretnym przypadku użycia toBeReplacedwzorzec nie jest tak prosty jak „słowo pod kursorem”, dlatego potrzebuję małego, konkretnego makra, które mógłbym utworzyć w drodze. I jeszcze raz: zbyt specyficzne dla mapy: \ i tak dziękuję :)
iago-lito
2
Być może umieść wzór w rejestrze, a następnie dostosuj powyższe mapowanie, aby automatycznie uzyskać zawartość rejestru jako toBeReplacedczęść (zamiast bieżącego słowa pod kursorem, co jest bardziej ograniczające).
VanLaser,
1
@VanLaser Racja, to pozwoli na ogólne mapowanie, a także znacznie uprości: va{:s/<C-r>0//g<Left><Left>Dzięki temu możesz szarpać dowolny wzór, którego potrzebujesz wcześniej, a następnie po prostu naciśnij mapowany klawisz, aby zastąpić ten wzór czymś w bieżącym blok.
dhakimian