Vim sem Esc

may. 21, 2012·
Julio Batista Silva
Julio Batista Silva
· 4 min de lectura
blog Vim

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
Autores
Senior Cloud Developer

Soy un ingeniero informático brasileño radicado en Alemania, apasionado por la tecnología, la ciencia, la fotografía y los idiomas.

Llevo programando cerca de dos décadas, explorando desde apps móviles y desarrollo web hasta aprendizaje automático. Hoy me enfoco en SRE en la nube e ingeniería de datos.

Soy voluntario en las comunidades de open source y Python, ayudando a organizar PyCon DE y PyData Berlin, dando mentorías y contribuyendo con código y traducciones.

En mi blog comparto consejos de Linux, guías de configuración y notas personales que escribí como referencia futura. Espero que también sean útiles para otras personas. El contenido está disponible en varios idiomas.

Visita mi galería para ver algunas de mis fotografías.

Fuera del teclado, me encontrarás en conciertos, tocando el clarinete, en bicicleta, buceando o explorando nuevos lugares, culturas y cocinas.

¡Siempre feliz de conectar! 🙂

comments powered by Disqus