vim vários mapeamentos específicos

0

Qual é a melhor maneira de especificar vários modos para um mapa no vim?

Eu sei que nmap x y dispara y ao receber x quando em normal mode ,

imap x y dispara y ao receber x quando em insert mode e assim por diante.

Digamos que eu queira especificamente esses dois modos. Então eu não posso usar map x y .

Apenas escrever duas linhas produz muita confusão quando feito para vários mapeamentos.

    
por omnesia 02.08.2017 / 19:57

1 resposta

0

De :h mapmode-n :

There are six sets of mappings

  • For Normal mode: When typing commands.
  • For Visual mode: When typing commands while the Visual area is highlighted.
  • For Select mode: like Visual mode but typing text replaces the selection.
  • For Operator-pending mode: When an operator is pending (after "d", "y", "c", etc.). See below: |omap-info|.
  • For Insert mode. These are also used in Replace mode.
  • For Command-line mode: When entering a ":" or "/" command.

Existem muitas maneiras diferentes de fazer um mapeamento. Se você :h map , você verá quais modos os vários comandos mapeiam modos para:

:map    {lhs} {rhs}     |mapmode-nvo|       *:map*
:nm[ap] {lhs} {rhs}     |mapmode-n|     *:nm* *:nmap*
:vm[ap] {lhs} {rhs}     |mapmode-v|     *:vm* *:vmap*
:xm[ap] {lhs} {rhs}     |mapmode-x|     *:xm* *:xmap*
:smap   {lhs} {rhs}     |mapmode-s|         *:smap*
:om[ap] {lhs} {rhs}     |mapmode-o|     *:om* *:omap*
:map!   {lhs} {rhs}     |mapmode-ic|        *:map!*
:im[ap] {lhs} {rhs}     |mapmode-i|     *:im* *:imap*
:lm[ap] {lhs} {rhs}     |mapmode-l|     *:lm* *:lmap*
:cm[ap] {lhs} {rhs}     |mapmode-c|     *:cm* *:cmap*

Como você pode ver, :map diz mapmode-nvo , que significa o modo normal, visual e com operador pendente . Essa é a razão pela qual map x y não funciona no modo normal. Olhando através desta lista, você pode ver como nenhum deles tem mapmode-in , então não há uma maneira de fazer isso. Então você precisará fazer nmap x y e imap x y . Ou se você quiser aplicar em todos os modos, map x y e map! x y .

Just writing two lines produces a lot of clutter when done for multiple mappings.

Se você realmente estiver fazendo muitos mapeamentos, poderá fazer isso:

function! DoubleMap(x, y)
  exec "nmap ".x." ".y
  exec "imap ".x." ".y
endfunction

Então

imap x y
nmap x y
imap foo bar
nmap foo bar
imap blah spam
nmap blah spam

Torna-se

call DoubleMap('x', 'y')
call DoubleMap('foo', 'bar')
call DoubleMap('blah', 'spam')

Mas isso será um problema se o seu mapeamento tiver cotações ou caracteres não imprimíveis.

    
por 02.08.2017 / 20:34

Tags