Qual è la differenza tra i comandi di mapping remap, noremap, nnoremap e vnoremap in Vim?


1114

Qual è la differenza tra i remap, noremap, nnoremape vnoremapcomandi di mappatura in Vim?


1
Attenzione vnoremape vmapfunziona in modalità Visual AND Select. Per avere una mappatura solo in modalità Visual, usare xmape xnoremap.
Benoit,

Risposte:


1628

remapè un'opzione che fa funzionare ricorsivamente i mapping. Di default è attivo e ti consiglio di lasciarlo così. Il resto sono comandi di mappatura , descritti di seguito:

:mape :noremapsono versioni ricorsive e non ricorsive dei vari comandi di mappatura. Ciò significa che se lo fai:

:map j gg
:map Q j
:noremap W j

jverrà mappato a gg. Qverrà anche mappato su gg, poiché jverrà espanso per il mapping ricorsivo. Wverrà mappato su j(e non su gg) perché jnon verrà espanso per il mapping non ricorsivo.

Ora ricorda che Vim è un editor modale . Ha una modalità normale , visiva e altre modalità.

Per ognuna di queste serie di mappature, esiste una mappatura che funziona in modalità normale, visiva, di selezione e operatore ( :mape :noremap), una che funziona in modalità normale ( :nmape :nnoremap), una in modalità visiva ( :vmape :vnoremap) e così via.

Per ulteriori indicazioni al riguardo, vedere:

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

8
Grazie per la tua risposta! Inoltre, quando viene utilizzato ricorsivo e quando viene utilizzato non ricorsivo?
Chetan,

14
@Chetan: dipende da cosa vuoi ottenere. Tendo a usare più spesso non ricorsivo, ma se hai definito una mappatura relativamente complicata usando non ricorsiva e quale altra mappatura che fa tutto ciò che la prima mappatura fa e altro, può essere più facile usare una mappatura ricorsiva che include il quello originale invece di riscrivere di nuovo l'intero non ricorsivo (in particolare se è necessario modificare quello originale).
DrAl,

10
Avevo assunto noremapdi essere un opposto di map. Intendo qualcosa che rimuove una mappatura. Grazie per la risposta. Mi ha chiarito
Pavan Manjunath il

4
Non è così importante per la maggior parte dei casi d'uso, ma va notato che :map, ecc. Non funzionano in tutte le modalità, esattamente, solo quelle comuni (in particolare, modalità normale, modalità visiva, modalità di selezione e modalità operatore in attesa). Se si desidera che un mapping funzioni in modalità insert, riga di comando o lang-arg, è necessario utilizzare :map!, ecc. (Fonte: vimdoc.sourceforge.net/htmldoc/map.html#map-overview )
Ken Bellows

3
@whytheq noremap = mappatura non ricorsiva
Dan Bechard

281

Penso che la documentazione di Vim avrebbe dovuto spiegare il significato dietro la denominazione di questi comandi. Solo dirti cosa fanno non ti aiuta a ricordare i nomi.

mapè la "radice" di tutti i comandi di mappatura ricorsiva. Il modulo radice si applica alle modalità "normale", "visivo + selezione" e "in attesa dell'operatore". (Sto usando il termine "radice" come in linguistica .)

noremapè la "radice" di tutti i comandi di mappatura non ricorsivi. Il modulo radice si applica alle stesse modalità di map. (Pensa al noreprefisso come "non ricorsivo".)

(Notare che ci sono anche le !modalità come map!quelle applicabili per inserire e riga di comando.)

Vedi sotto per cosa significa "ricorsivo" in questo contesto.

Preparare una lettera di modalità come nmodificare le modalità in cui funziona la mappatura. Può scegliere un sottoinsieme dell'elenco di modalità applicabili (ad esempio solo "visivo") o scegliere altre modalità che mapnon si applicano (ad esempio "inserire").

L'uso help map-modesmostrerà alcune tabelle che spiegano come controllare a quali modalità si applica la mappatura.

Lettere modalità:

  • n: solo normale
  • v: visivo e seleziona
  • o: operatore in sospeso
  • x: solo visivo
  • s: seleziona solo
  • i: inserire
  • c: riga di comando
  • l: insert, riga di comando, regexp-search (e altri. Collettivamente chiamato pseudo-modalità "Lang-Arg")

" Ricorsivo " significa che la mappatura viene espansa in un risultato, quindi il risultato viene espanso in un altro risultato e così via.

L'espansione si interrompe quando uno di questi è vero:

  1. il risultato non è più associato a nient'altro.
  2. è stata applicata una mappatura non ricorsiva (ovvero la "noremap" [o uno dei suoi simili] è l'espansione finale).

A quel punto, il "significato" predefinito di Vim del risultato finale viene applicato / eseguito.

" Non ricorsivo " significa che la mappatura viene espansa una sola volta e quel risultato viene applicato / eseguito.

Esempio:

 nmap K H
 nnoremap H G
 nnoremap G gg

Quanto sopra fa Kespandere a H, quindi Hespandere Ge arrestare. Si interrompe a causa di nnoremap, che si espande e si interrompe immediatamente. Il significato di Gverrà eseguito (ovvero "passa all'ultima riga"). Al massimo una mappatura non ricorsiva verrà mai applicata in una catena di espansione (sarebbe l'ultima espansione a verificarsi).

La mappatura di Gto ggsi applica solo se si preme G, ma non se si preme K. Questa mappatura non influisce sulla pressione Kindipendentemente dal fatto che sia Gstata mappata in modo ricorsivo o meno, poiché è la linea 2 che provoca l' Karresto dell'espansione , quindi la linea 3 non verrebbe utilizzata.


4
Una cosa: mapvale solo per le modalità normali, visive, di selezione e in attesa dell'operatore, non per tutte le modalità.
Brian McCutchon,

1
dovrebbe essere accettata la risposta.
Tycholiz,

questa è una risposta molto migliore di quella accettata.
MilMike

19

Una differenza è che:

  • :map fa nvo== normale + (visivo + seleziona) + operatore in sospeso
  • :map!fa ic == inserto + modalità riga di comando

come indicato nelle help map-modestabelle.

Quindi: mapnon mappa a tutte le modalità .

Per mappare a tutte le modalità sono necessari entrambi :mape :map!.


5
Attento !! command modeè un altro nome storico per normal modevale a dire. cap. 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro ). L'abbreviazione 'c' sta per 'riga di comando'. In altre parole, per impostazione predefinita: mappa map! lhs rhs ricorsivamente da lhs a rhs per le modalità insert + command-LINE . Questo a meno che l' remapopzione predefinita non sia esplicitamente disabilitata con set noremap[!]in ~ / .vimrc. In tal caso la mappatura non sarebbe ricorsiva (non consigliabile).
Cbhihe,
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.