Quali sono le differenze tra i comandi map, noremap, abbrev e noreabbrev?


19

Questi comandi trasformano in qualche modo una serie di sequenze di tasti in un'altra, ma sono un po 'confuso su quale sia il più appropriato per una situazione. Inoltre, ci sono anche delle !varianti. Al momento, il mio uso di questi è piuttosto casuale, quindi potrei sapere quali sono le insidie ​​associate a ciascuno? In particolare, le note sulle varie versioni della modalità potrebbero essere utili, poiché ho imparato da Peter Rincker in un commento che cmappuò espandersi praticamente ovunque nella riga e non solo quando sto usando i :comandi. Quali precauzioni posso prendere contro potenziali insidie?


La parte successiva è un po 'meta: quale modulo dovremmo usare mentre rispondiamo su questo sito? - dovrei chiedere questo su Meta o aggiungerlo alla domanda?
Muru,

Direi che dipende. Userei sempre la versione noremap se dimostrassi una mappatura. In questo modo, le persone hanno l'abitudine di utilizzare le mappature non ricorsive rispetto alle versioni ricorsive. A meno che, naturalmente, non vi sia un motivo per utilizzare la mappa in modo specifico, ad esempio, in una mappatura <Plug>.
akshay,

Risposte:


21

Innanzitutto, mape noremapsono simili per il fatto che ognuno di essi crea mappature per le modalità normale, visiva, di selezione e operatore in sospeso contemporaneamente . Vim dettaglia questo in :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

Come per la guida di cui sopra, se si desidera limitare la mappatura a una modalità specifica, è necessario anteporre:

'n' (per normale), 'v' (per visivo e seleziona), 'c' (per comando), 'x' (per modo visivo), 's' (per selezione), 'o' (per operatore in sospeso ).

Per esempio,

nmap n nzz

creerà una modalità normale, mappatura ricorsiva di n.

Ora, noremapè solo una versione non ricorsiva di map.

Cos'è la mappatura non ricorsiva? Anche Vim ha la risposta, con :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.

Un esempio di questo è il mapping di quanto segue:

:imap j k

:imap k j

Ora, vim sostituirà j con k e k con j un numero infinito di volte e mostrerà quindi un errore che hai creato una mappatura ricorsiva.

Questo è il motivo per cui in genere si consiglia di utilizzare quasi sempre (tranne quando si dispone di <Plug>mapping o simili) mapping non ricorsivi. Ciò impedisce che Vim si blocchi quando si creano inavvertitamente mappature ricorsive. La mappatura non ricorsiva è quindi un modo più sicuro per mappare i comandi in Vim.

Con le informazioni di cui sopra a portata di mano, possiamo vedere che :noreabbrevè solo una versione non ricorsiva del :abbrevcomando.

È possibile utilizzare :abbrevsolo nelle modalità di inserimento, sostituzione e comando. :abbrevè usato per creare abbreviazioni, (ovvero le scorciatoie che Vim può espandere). La breve spiegazione è usare :map/ :noremapper creare mappature, :abbrev/ :noreabbrevper creare abbreviazioni o quando vuoi che Vim espanda la tua digitazione.


1
Evitare i blocchi non è l'unico motivo per utilizzare i noremoduli del comando map. Un altro (e secondo me, più importante) motivo per usarli è che rendono le tue mappature affidabili / prevedibili. Se usi la forma semplice e rhscontiene una chiave che sembra essere mappata a qualcos'altro, la tua mappatura potrebbe avere un comportamento completamente diverso da quello previsto.
Ricco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.