Jakie są różnice między poleceniami map, noremap, abbrev i noreabbrev?


19

Te polecenia w pewien sposób przekształcają jeden zestaw naciśnięć klawiszy na inny, ale jestem nieco rozmyślny, który z nich jest najbardziej odpowiedni w danej sytuacji. Ponadto istnieją również ich !warianty. W tej chwili ich użycie jest dość przypadkowe, więc czy mogę wiedzieć, jakie są z tym pułapki? Przydatne mogą być w szczególności uwagi na temat różnych wersji trybów, ponieważ nauczyłem się od Petera Rinckera w komentarzu, który cmapmoże rozwinąć się praktycznie w dowolnym miejscu linii, i to nie tylko wtedy, gdy używam :poleceń. Jakie środki ostrożności mogę podjąć przed potencjalnymi pułapkami?


Kolejna część to trochę meta: z jakiej formy powinniśmy korzystać, odpowiadając na tej stronie? - czy powinienem to zadać na Meta, czy dodać to do pytania?
muru

Powiedziałbym, że to zależy. Zawsze używałbym wersji noremap podczas demonstrowania mapowania. W ten sposób ludzie zyskują nawyk korzystania z mapowania nierekurencyjnego w stosunku do wersji rekurencyjnych. O ile oczywiście nie ma powodu, aby używać mapy konkretnie, na przykład w mapowaniu <Plug>.
akshay

Odpowiedzi:


21

Po pierwsze, mapi noremapsą podobne w tym, że każde stworzenie mapowania dla normalnego, wizualne, wybierz i operator czeka trybów równocześnie . Vim szczegółowo to w :help map-overview:

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

Zgodnie z powyższą pomocą, jeśli chcesz ograniczyć mapowanie do określonego trybu, musisz wcześniej:

„n” (dla trybu normalnego), „v” (dla trybu wizualnego i wyboru), „c” (dla polecenia), „x” (dla trybu wizualnego), „s” (dla wyboru), „o” (dla operatora w toku ).

Na przykład,

nmap n nzz

stworzy tryb normalny, mapowanie rekurencyjne n.

Teraz noremapjest tylko nierekurencyjną wersją map.

Czym jest mapowanie nierekurencyjne? Vim też ma na to odpowiedź :help map-recursive:

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

Przykładem tego jest mapowanie następujących elementów:

:imap j k

:imap k j

Teraz vim zamieni j razy k i k j nieskończoną liczbę razy i dlatego pokaże ci błąd, że stworzyłeś mapowanie rekurencyjne.

Dlatego generalnie zaleca się, aby prawie zawsze (z wyjątkiem <Plug>mapowań lub podobnych) używać mapowań nierekurencyjnych. Zapobiega to zawieszaniu się Vima podczas nieumyślnego tworzenia mapowań rekurencyjnych. Mapowanie nierekurencyjne jest zatem bezpieczniejszym sposobem mapowania poleceń w Vimie.

Biorąc pod uwagę powyższe informacje, możemy zobaczyć, że :noreabbrevjest to nierekurencyjna wersja :abbrevpolecenia.

Możesz używać :abbrevtylko w trybach wstawiania, zastępowania i poleceń. :abbrevsłuży do tworzenia skrótów (skrótów, które Vim może rozwinąć). Krótkie wyjaśnienie polega na użyciu :map/ :noremapdo tworzenia mapowań, :abbrev/ :noreabbrevdo tworzenia skrótów lub za każdym razem, gdy chcesz, aby Vim rozwinął pisanie.


1
Unikanie zawieszeń nie jest jedynym powodem korzystania z noreformularzy polecenia map. Innym (i moim zdaniem, ważniejszym) powodem ich użycia jest to, że sprawiają, że twoje mapowania są wiarygodne / przewidywalne. Jeśli użyjesz zwykłego formularza, a rhszawiera on klucz, który jest mapowany na coś innego, wówczas twoje mapowanie może mieć zupełnie inne zachowanie niż zamierzone.
Bogaty
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.