Blog do Julio

Hacks, tutoriais e dicas

Vim Sem Esc

| Comments

Como já até comentei em um post anterior, eu considero que a tecla Esc do meu teclado além de pequena está mal posicionada. Para um usuário frequente do editor Vim isso é um grande problema, já que o Esc é uma das teclas mais usadas. É por ela que acessamos o modo de comandos (normal mode).

Até mesmo em teclados mais comuns o longo caminho para pressionar essa tecla não parece natual. E, de fato, não é! Quando Bill Joy criou o vi ele usava um ADM-3A. Só de olhar para o teclado desse computador percebemos o motivo para algumas escolhas de teclas: As setas de movimento eram impressas nas teclas HJKL e o Esc era localizado onde hoje temos o Tab. Como sempre, existe mais de um jeito de contornar esse problema. Aqui mostrarei 5 alternativas à tecla Esc.

Ctrl-[

No Vim, o Ctrl-[ tem exatamente a mesma função que o Esc. Apesar de serem duas teclas, usar este comando é bem mais prático e requer um deslocamento menor. Provavelmente demora algumas semanas para acostumar, mas tem a vantagem de não precisar de nenhuma configuração extra, pois ele é um comando embutido no Vim. (Veja :help i_CTRL-[)

Ctrl-c

Em outros editores esse geralmente é o comando para copiar texto, mas no Vim o Ctrl-c serve para sair do modo de inserção e ir para o modo normal. Ele não é exatamente idêntico ao Esc, mas na prática é parecido o suficiente. De qualquer forma no meu teclado o comando Ctrl-[ é bem mais fácil. (Veja :help i_CTRL-C)

Alt/Meta

No meu terminal, digitar Alt+alguma_tecla é equivalente a pressionar Esc mais aquela tecla. Também não é exatamente igual ao Esc, pois tem uma ação ou movimento a mais e só funciona em alguns terminais. Porém é bastante útil. E.g.:

  • Alt+hjkl: Movimentação
  • Alt+o: Abre nova linha abaixo da posição atual
  • Alt+A: Append ao final da linha atual
  • Alt+p: Cola na posição atual

Mapeações pelo .vimrc

Algumas pessoas mapeiam o Esc para um combo de teclas, as mais interessantes são: imap ;; imap jk imap ii

Porém você terá problemas se algum dia precisar digitar ;;, jk ou ii.

Troque o Esc com o Caps Lock

Finalmente a minha opção favorita, mas que requer um pouco mais de configuração, pois como o Caps Lock é uma tecla modificadora não podemos mapeá-la pelo Vim.
Teremos que modificar a função da tecla no sitema inteiro, o que sinceramente não é um problema, já que raramente uso o Caps Lock. Existe mais de um jeito de se fazer isso:

Setxkbmap

O jeito mais simples é usar o setxkbmap, que possui uma opção especificamente para alternar o Caps Lock com o Esc: julio@julio-acer ~> setxkbmap -option caps:swapescape

Adicione esse comando ao .xinitrc se quiser que ele seja executado toda a vez que iniciamos o X. No meu caso eu também uso o setxkbmap para configurar todo o layout do meu teclado: setxkbmap -model pc105 -layout gb -variant intl -option caps:swapescape

Xmodmap

Se você não quiser que o Esc se torne Caps Lock (e ficar com dois Esc), pode usar o Xmodmap.

  1. Adicione as seguintes linhas a um arquivo (sugestão: ~/.Xmodmap): remove Lock = Caps_Lock keysym Caps_Lock = Escape

  2. Edite seu .xinitrc para definir o mapeamento toda vez que você iniciar o X: xmodmap ~/.Xmodmap

  3. Encontrei esse script na internet. Ele também usa o xmodmap, mas simplifica o processo de ligar e desligar o Caps Lock:

caps - caps.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
case $1 in
    off)
        xmodmap -e "clear lock"
        xmodmap -e "keycode 0x42 = Escape"
        ;;
    on)
        xmodmap -e "keycode 0x42 = Caps_Lock"
        xmodmap -e "add lock = Caps_Lock"
        ;;
    *)
        echo "Uso: caps {on|off}, liga e desliga o Caps Lock"
        echo "Quando desligado, ele funciona como a tecla Esc"
        ;;
esac

Terminal

Um problema das soluções anteriores é que elas só funcionam no X. Para trocar o Caps Lock com o Esc no terminal, basta executar o seguinte comando: julio@julio-acer ~> (echo dumpkeys | grep -i keymaps; echo keycode 58 = Escape; echo keycode 1 = Caps_Lock) | sudo loadkeys -

Por praticidade, adicione um alias ao ~/.zshrc: alias nocaps=‘(echo dumpkeys | grep -i keymaps; echo keycode 58 = Escape; echo keycode 1 = Caps_Lock) | sudo loadkeys -’


Links:

Comments