TL;DR Claude Code tiene vim mode de verdad (NORMAL, INSERT, VISUAL, motions, text objects) y se enciende con
"editorMode": "vim". Lo que casi nadie sabe es que desde la v2.1.208 puedes mapear una secuencia de dos teclas a Escape con"vimInsertModeRemaps": { "jj": "<Esc>" }. Yo llevaba meses con vim mode encendido y sin esto, estirando el meñique en cada frase. Ojo a la regla del segundo: si tardas más de uno entre las dos teclas, las dos se quedan escritas, así que puedes seguir tecleando palabras conjjdentro.
Si vienes de vim, la primera hora en Claude Code duele de una forma muy concreta. Escribes el prompt, quieres corregir una palabra tres atrás, y tu mano ya ha hecho Esc antes de que tu cabeza decida nada. Solo que ahí no pasaba nada.
Sí pasa. Hay un vim mode completo dentro del prompt, y lleva ahí más de lo que parece.
Encenderlo
// ~/.claude/settings.json
{
"editorMode": "vim"
}
También desde /config, en Editor mode, si prefieres no tocar el fichero. A partir de ahí Esc te lleva a NORMAL, e i I a A o O te devuelven a INSERT como esperas.
Lo que casi nadie tiene puesto
El meñique al Escape es el peaje de vim en cualquier sitio, y por eso medio mundo mapea jj. En Claude Code se puede desde la v2.1.208:
{
"editorMode": "vim",
"vimInsertModeRemaps": { "jj": "<Esc>" }
}
Y aquí es donde conviene leer la letra pequeña, porque tiene cuatro reglas que no vas a adivinar:
1. Dos caracteres imprimibles, ni uno más ni uno menos
La clave tiene que medir exactamente dos. Una entrada más larga o más corta se ignora en silencio, sin avisarte de nada.
2. "<Esc>" es el único destino posible
No es un sistema de mapeos general. Puedes elegir qué dos teclas te llevan a NORMAL, y nada más. Cualquier otro destino se descarta.
3. La ventana de un segundo
Al teclear la primera letra se escribe normal, como cualquier carácter. Si pulsas la segunda antes de un segundo, Claude Code borra la que estaba pendiente y te pasa a NORMAL, sin dejar ninguna de las dos en el prompt. Si tardas más, o si pulsas otra tecla, las dos se quedan como texto literal.
Eso último es lo que hace que la cosa sea usable: puedes seguir escribiendo palabras que llevan jj dentro, solo tienes que hacer una pausa mínima entre las dos.
4. Un repositorio no puede remapearte el teclado
Este ajuste solo se lee de tus settings de usuario, del flag --settings y de los managed settings. Lo que haya en el .claude/settings.json de un proyecto se ignora. Es deliberado: si no fuese así, clonar un repo cualquiera podría cambiarte lo que hacen tus teclas.
Lo que hay dentro de NORMAL
No es un vim de mentira con cuatro flechas. Esta es la parte que más sorprende:
| Grupo | Comandos |
|---|---|
| Movimiento | h j k l · w e b · 0 $ ^ · gg G |
| Saltar a carácter | f{c} F{c} t{c} T{c} · ; y , para repetir |
| Borrar y cambiar | x dd D dw de db · cc C cw ce cb · s S |
| Copiar y pegar | yy Y yw ye yb · p P |
| Otros | >> << para indentar · J unir líneas · u deshacer · . repetir |
| Text objects | iw aw iW aW · i" a" · i' a' · i( a( · i[ a[ · i{ a{ |
Con v entras en VISUAL por caracteres y con V por líneas, y los operadores actúan sobre la selección.
Dos detalles que se agradecen cuando llevas un rato: en NORMAL, si el cursor ya no puede moverse más arriba o más abajo, j y k pasan a navegar el historial de comandos en vez de quedarse quietos. Y / abre la búsqueda inversa del historial, lo mismo que Ctrl+R.
Requisitos y avisos de versión
vimInsertModeRemaps pide v2.1.208 o superior. Un par de cosas más son recientes y conviene saberlo si algo no te responde: s y S llegaron en la v2.1.211, y . no repetía bien los operadores de cambio (cw, cc) ni los pegados hasta la v2.1.216. Comprueba con claude --version.
Si vienes de leer sobre teclas en Claude Code, el otro sitio donde la gente se atasca es el salto de línea con Shift+Enter, que depende del terminal y tiene su propia solución. Y si el teclado no es lo tuyo, existe el modo de dictado por voz.
Documentación oficial: Interactive mode · Settings