Dia 27: Mapas de teclado
Mapas de teclado permitem que sejam feitos atalhos para comandos mais complexos, em qualquer modo. Para isso, existem os seguintes comandos em modo de comando:
map
: Cria um mapeamento em qualquer modo;imap
: Cria um mapeamento apenas em modo de inserção;nmap
: Cria um mapeamento apenas em modo normal;vmap
: Cria um mapeamento apenas em modo visual.
Todos os comandos são utilizados passando duas partes: a primeira identifica o
atalho; e o segundo define o comando a ser executado. Note que para teclas
especiais, devem ser usados os sinais de maior-que e menor-que ("<
e >
") e
qualquer coisa coisa fora desses comandos é tratado como uma tecla normal do
teclado.
Por exemplo, utilizando o comando ":r
" é possível ler o conteúdo de outro
arquivo dentro do arquivo atual; mas ":r
" também consegue executar comandos
externos e colocar o resultado dentro do arquivo atual. Assim, é possível
fazer :r !date
para colocar a data atual do sistema dentro do arquivo.
Usando mapas, é possível automatizar esse processo todo com apenas uma tecla:
imap <F4> <Esc>:r !date<CR>o
O que o mapa está fazendo é, primeiramente, funcionar apenas em modo de
inserção; quando for pressionada a tecla [F4]
, VIM irá sair de modo de
inserção, executar :r !date
, pressionar enter e adicionar uma nova linha
abaixo do resultado.
Outro exemplo:
imap <C-s> <Esc>:w<CR>a
e
nmap <C-s> :w<CR>
Irá fazer com que [C-s]
, em modo de inserção e modo normal, salvem o arquivo
atual1, permanecendo no modo atual -- no caso do modo normal, não há mais
nada a ser feito; no modo de inserção, é preciso retornar ao modo, o que é
feito com o comando a
.
Um cuidado que deve ser cuidado é que mapas avaliam mapas. Por exempo,
imap a bc
e
imap b cd
irá produzir "cdc" cada vez que a tecla "[a]
" (sem qualquer necessidade de
perssionar outra tecla) porque ao avaliar a
, VIM irá perceber o "b" e irá
avaliar b
também. Essa funcionalidade, apesar de poderosa, deve ser usada
com cuidado porque pode acontecer de criar um "loop" e o VIM travar2. Por
exemplo:
imap a b
e imap b a
irá criar um loop em que o mapeamento de "a" irá chamar "b" e o mapeamento de
"b" irá chamar "a", infinitamente. Para evitar esses casos, existem os
comandos :noremap
(com todos os prefixos mostrados acima) que não avaliam
outros mapeamentos.
E, finalmente, para remover um mapemaneto, :unmap
(novamente, com os
prefixos dos modos mostrados acima), seguido do mapeamento criado.
1 Apenas cuide ao usar o atalho [C-s]
no console por se tratar de um
comando tratado pelo shell antes de chegar ao VIM. [C-s]
é usado para
suspender (pausar) a execuçào de um aplicativo, e você terá a impressão que o
VIM travou. Se você acidentalmente presscionar [C-s]
, para retornar a
execução, pressionar [C-q]
. Este problema não existe no GVIM.
2 Na verdade, o VIM parecerá travado, mas é possível quebrar o loop usando
[C-c]
.