Bądź jak Spielberg

Pracując z kodem nierzadko zdarza się sytuacja w której trzeba wykonać określoną operację X razy. A to trzeba dodać parokrotnie średnik na końcu linii, a to trzeba zmienić nazwę jakiejś zmiennej, a to przydało by się pozmieniać ?: na pełnowymiarowe ify. O ile w pierwszym przypadku pomocna jest kropka, kolejny można załatwić za pomocą :substitute i wyrażenia regularnego, o tyle chciałbym się pochylić nad przypadkiem nr 3. Również nie jest to nic skomplikowanego, jednak świetnie obrazuje wspaniałość pracy w vimie.

Rozważmy jednak bardziej przejrzysty przykład. Dajmy na to, że trafił nam się klient który za 1000$ chciałby umieścić każdy cytat z dialogu (takiego jak poniżej) w cudzysłowiu.

Dr. Alan Grant: You got any kids?
Dr. Ian Malcolm: Me? Oh, hell yeah, three. I love kids. Anything at all can and does happen. Same with wives, for that matter.
Dr. Alan Grant: You're married?
Dr. Ian Malcolm: Occaissionally. Yeah, I'm always on the lookout for a future ex-Mrs. Malcolm.

Rozbijmy ten problem na mniejsze kawałki:

  1. Ustawiamy kursor na początku słowia po pierwszym “:” w linii (f:w)
  2. Wstawiamy cudzysłów przed kursorem (i”)
  3. Wstawiamu cudzysłów na końcu linii (A”)
  4. Przechodzimy na początek kolejnej linii (+)
  5. Ustawiamy kursor na początku słowia po pierwszym “:” w linii (f:w)
  6. Wstawiamy cudzysłów przed kursorem (i”)
  7. Wstawiamu cudzysłów na końcu linii (A”)
  8. Przechodzimy na początek kolejnej linii (+)
  9. tl;dr

Zamiast X razy wyklikiwać tę samą kombinację klawiszy, możemy skorzystać z mechanizmu opisanege w :help pod tagiem “complex-repeat” (aka makra). Jego zastosowanie przypomina nagrywanie filmu, i oddtwarzanie go z powrotem.

Wystarczy przed jakąkolwiek sekwencją poleceń wcisnąć “q” w kombinacji z jakimkolwiek znakiem alfanumerycznym, np “qa”. Na dole ekranu pojawi się napis “recording”, a wszystkie uderzenia w klawisze aż do ponownego wciśnięcia “q” zostaną zapisane w rejestrze. Następnie wystarczy przejść do kolejnego miejsca w którym chcielibyśmy dokonać takich samych zmian i wcisnąć znak podany wcześniej poprzedzony @. Ponadto poprzednio wywołane makro możemy wywołać za pomocą @@. Jeśli przed @a, lub @@ podamy liczbę, spowoduje to wielokrotne wywołanie zapisanego polecenia.

przyklad dzialania mechanizmu complex-repeat

Problem przedstawiony we wstępie można rozwiązać analogicznie. Największy problem w pracy z makrami to dbanie o uniwersalność komend. W bardziej rozbudowanych przypadkach łatwo jest coś namieszać, co często prowadzi do katastrofy. Natomiast jeśli podczas prowadzania kombinacji omsknie nam się palec, a następnie umiejętnie skontrujemy błąd nie odbije się to zbytnio na działaniu makra.

przyklad dzialania mechanizmu complex-repeat