Vim sem Esc

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][adm3a]. 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. [adm3a]: https://en.wikipedia.org/wiki/ADM-3A [Bill Joy]: https://en.wikipedia.org/wiki/Bill_Joy

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

Mapeamentos pelo .vimrc

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

imap ;; <Esc>
imap jk <Esc>
imap ii <Esc>

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:

    #!/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 -'


Julio Batista Silva
Julio Batista Silva
Data Engineer

I’m a computer engineer passionate about science, technology, photography, and languages. Currently working as a Data Engineer in Germany.

comments powered by Disqus