Keybindy w VIM’ie

 

Chciałbym zaprezentować wam ogromne możliwości customizowania tego edytora do swoich potrzeb. Zawsze gdy ludzie widzą że klikam jeden guzik i nagle wywołuje się bogata seria komend pytają mnie co to za opcja. Przywykliśmy bowiem do bogatych środowisk, które mają na stałe przypisane większość funkcji do konkretnych klawiszy, a nawet jeśli da się zmienić je podług swoich potrzeb to nie spodziewamy się tego od przeciętnego użytkownika.

Vim umożliwia zmianę efektu konkretnego klawisza lub ich sekwencji w każdym trybie.

Załóżmy że jesteśmy w trybie normalnym. po wpisaniu:

:map k :!clear; echo Hello World<CR>

Nadpiszemy klawisz “k” trybu normalnego (poruszenie kursora w górę) przez skrypt czyszczący ekran i wypisujący napis “Hello World”.

Uwagi:

  1. :!clear; echo Hello World<CR> To zestaw znaków które zostaną wprowadzone do edytora tak, jakbyśmy ręcznie wpisali je z klawiatury.
  2. <CR> to symbol reprezentujący klawisz Enter.
  3. ! służy do wywoływania poleceń przy użyciu powłoki z której uruchomiliśmy vima. Zatem w moim przypadku zsh wywoła “clear; echo Hello World”

Po prostym przykładzie wypiszmy parę rzeczy

Lista znaków specjalnych:

  1. <CR> Enter
  2. <BS> Backspace
  3. <esc> Escape
  4. <F1> - <F12> Klawisze F1 – F12
  5. <Leader> klawisz “\”
  6. <C-x> – Ctrl + x. Za x możemy wsadzić dowolny inny klawisz.
  7. <M-x> – Alt + x. Za x możemy wsadzić dowolny inny klawisz.

Lista komend mapujących:

  1. map – zwykłe mapowanie
  2. nmap – mapowanie do trybu normalnego
  3. vmap – mapowanie do trybu wizualnego (zaznaczanie z v)
  4. imap – mapowanie do trybu wprowadzania
  5. vmap – mapowanie do trybu wizualnego (zaznaczanie z v)
  6. cmap – mapowanie do trybu linii komend (uruchamiany : )

~/.vimrc

Oczywiście wszystko wywoływaliśmy dla obecnej sesji edytora, żeby mapowanie było permamentne musimy dodać je do naszego \~/.vimrc.

Jeśli wykonujecie pracę w różnych językach programowania, możecie używać różnych bindów do różnych sytuacji. Ja na przykład używam:

if expand('%:t') =~ ".*\.sql"
   map <F8> :w<CR> :!mysql < % > out.sqlout; ./parser.pl out.sqlout > out.refactored;<CR> :tabe out.refactored<CR>
endif

Co powoduje, że gdy otwieram plik .sql guzik F8 zyskuje moc wywołania go na bazie danych, przefiltrowania wyniku i wyświetlenia go w nowej karcie przeglądarki.


Moja rada

Nie próbujcie na siłę przewidywać i planować bindów. Piszcie sobie nowe za każdym razem, gdy wykonacie jakąś powtarzalną czynność 10 razy. Powyższy przykład jest efektem wielokrotnego przełączania się między zakładkami, ręcznego wywoływania polecenia w zsh, powrotu do vima i otwarcia nowej zakładki.

Jeśli wasze bindingi będą faktycznie wynikać z waszych potrzeb, nie pogubicie się w nich i będziecie z nich korzystać tak efektywnie, jak to możliwe.


Dodatek dla napaleńców – Rekurencja

Jeśli zbindujemy k do wykonania s, a s do wykonania k, to Vim oszaleje. Do takich jaj powstały komendy z “nore” (non-recursive) jak :nnoremap. Najciekawsze zastosowanie możemy znaleźć tutaj:

nnoremap : ;
nnoremap ; :

Co sprawi, że będziemy mogli przechodzić do trybu linii komend : bez używania shifta, a komendę powtórzenia skoku wyrzuci na : .

Kolejnym przykładem jest:

:nmap dd O<esc>jddk

Który w rozwinięciu klawisza dd zawiera dd samo w sobie. Tutaj też powinniśmy użyć nnoremap, który wywoła podstawowe vimowe dd.


Co dalej

Ten naskrobany w trakcie wykładu post nie wyczerpuje w pełni tematu, a przedstawia tylko najbardziej powieszchowne moje użycie przepinania klawiszy. Jeśli jesteś zainteresowany rzetelnym tutorialem, gorąco polecam:

Vim Wiki – Mapping