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 natural.
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

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 sistema 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:

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 X11:

    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 -'

Atualização

Hoje em dia (2022) eu encontrei a solução ideal que é ter um teclado configurável.

Comprei um Moonlander Mark I e mapeei o Caps Lock para a tecla à esquerda do A.

Nenhuma alteração via software necessária.


Julio Batista Silva
Julio Batista Silva
Engenheiro de Dados

Eu sou um engenheiro de computação apaixonado por ciência, tecnologia, fotografia e idiomas. Atualmente trabalhando como Engenheiro de Dados na Alemanha.

comments powered by Disqus