104. Movimientos básicos: h, j, k, l y más 🏃
La base de todo en Vim
Si hay algo que debes dominar completamente en Vim son los movimientos. A diferencia de otros editores donde navegas principalmente con el mouse y las flechas, en Vim la navegación con teclado es el corazón de la productividad.
🕹️ Los movimientos fundamentales
Las teclas hjkl (el núcleo)
k
↑
h ← + → l
↓
j
Tecla | Dirección | Mnemotécnico |
---|---|---|
h | ← Izquierda | heft (izquierda en inglés) |
j | ↓ Abajo | j parece una flecha hacia abajo |
k | ↑ Arriba | k está arriba de j |
l | → Derecha | left contrario, o last |
¿Por qué hjkl y no las flechas?
- Eficiencia: Tus dedos nunca salen de la fila principal
- Historia: En las máquinas ADM-3A (donde se creó vi) estas teclas tenían flechas
- Velocidad: Una vez que lo dominas, es mucho más rápido
- Disponibilidad: Funciona en cualquier teclado, incluso sin flechas
🏃♂️ Movimientos por palabra
Navegación básica por palabras
Comando | Acción | Ejemplo |
---|---|---|
w | Siguiente palabra | hello world → cursor de h a w |
b | Palabra anterior | hello world → cursor de w a h |
e | Final de palabra actual | hello world → cursor de h a o |
Navegación por PALABRAS (separadas por espacios)
Comando | Acción | Diferencia |
---|---|---|
W | Siguiente PALABRA | Ignora signos de puntuación |
B | PALABRA anterior | hello-world.js es una PALABRA |
E | Final de PALABRA | hello.world → cursor va al final |
Ejemplo práctico:
const myFunction = (param1, param2) => {
- `w`: const → my → Function → = → ( → param1 → , → param2 → ) → = → > → {
- `W`: const → myFunction → = → (param1, → param2) → => → {
📏 Movimientos por línea
Comando | Acción | Uso común |
---|---|---|
0 | Inicio de línea | Ir al primer carácter |
^ | Primer carácter no-blanco | Ignorar indentación |
$ | Final de línea | Ir al último carácter |
g_ | Último carácter no-blanco | Ignorar espacios finales |
Ejemplo visual:
const message = "Hello World";
^ ^ ^ ^
| | | |
| primer no-blanco (^) | final de línea ($)
| último no-blanco (g_)
inicio de línea (0)
🖼️ Movimientos por pantalla
Navegación vertical
Comando | Acción | Descripción |
---|---|---|
H | Top de pantalla | High |
M | Medio de pantalla | Middle |
L | Bottom de pantalla | Low |
Scroll de pantalla
Comando | Acción | Páginas |
---|---|---|
Ctrl+f | Página abajo | Forward |
Ctrl+b | Página arriba | Backward |
Ctrl+d | Media página abajo | Down |
Ctrl+u | Media página arriba | Up |
Centrar pantalla
Comando | Acción | Uso |
---|---|---|
zz | Centrar línea actual | Ver contexto |
zt | Línea actual al top | Ver qué viene después |
zb | Línea actual al bottom | Ver qué vino antes |
🎯 Movimientos por archivo
Comando | Acción | Alternativa |
---|---|---|
gg | Inicio del archivo | 1G |
G | Final del archivo | :$ |
{número}G | Ir a línea número | :{número} |
{número}gg | Ir a línea número | Mismo que arriba |
Ejemplos:
5G " Ir a línea 5
42gg " Ir a línea 42
:100 " Ir a línea 100
🔍 Búsqueda en la línea actual
Find (buscar)
Comando | Acción | Ejemplo |
---|---|---|
f{char} | Buscar carácter hacia adelante | f( busca siguiente ( |
F{char} | Buscar carácter hacia atrás | F( busca anterior ( |
t{char} | Hasta carácter hacia adelante | t( va antes del ( |
T{char} | Hasta carácter hacia atrás | T( va después del ( |
Repetir búsquedas
Comando | Acción |
---|---|
; | Repetir última búsqueda f/F/t/T |
, | Repetir en dirección opuesta |
Ejemplo práctico:
function calculateTotal(price, tax, discount) {
Si el cursor está al inicio:
f(
→ va al primer paréntesisf,
→ va a la primera coma;
→ va a la segunda comaF(
→ regresa al paréntesis
🧮 Modificadores numéricos
Cualquier movimiento puede ser precedido por un número:
Comando | Acción |
---|---|
3w | Avanzar 3 palabras |
5j | Bajar 5 líneas |
2f, | Buscar la segunda coma |
10h | Ir 10 caracteres a la izquierda |
💪 Ejercicio práctico
Abre un archivo de código existente y practica estos movimientos:
Ejercicio 1: Navegación básica
- Usa solo
hjkl
durante 10 minutos - No uses las flechas del teclado
- Navega por todo el archivo
Ejercicio 2: Movimientos por palabra
const users = ['alice', 'bob', 'charlie'];
const admin = users.find(user => user.role === 'admin');
- Posiciona el cursor al inicio de la primera línea
- Usa
w
para ir palabra por palabra - Usa
b
para regresar - Prueba
W
yB
para ver la diferencia
Ejercicio 3: Búsqueda en línea
.container { margin: 10px; padding: 20px; border: 1px solid #ccc; }
- Ve al inicio de la línea con
0
- Usa
f:
para ir al primer:
- Usa
;
para ir al siguiente:
- Usa
F.
para regresar al punto anterior
🎮 Modo de práctica diaria
Día 1-3: Básicos
- Solo
hjkl
(nada de flechas) w
,b
,e
para palabras0
,$
para líneas
Día 4-7: Intermedio
f
,F
,t
,T
con repetición;
,,
H
,M
,L
para pantalla- Números con movimientos (
3w
,5j
)
Día 8+: Avanzado
- Combinaciones fluidas
gg
,G
para archivoCtrl+f
,Ctrl+b
para páginas
🚨 Errores comunes
1. Volver a las flechas
- Problema: Usar flechas cuando hjkl es difícil
- Solución: Desactiva las flechas en tu
.vimrc
:
" Desactivar flechas en modo normal
nnoremap <Up> <Nop>
nnoremap <Down> <Nop>
nnoremap <Left> <Nop>
nnoremap <Right> <Nop>
2. No usar modificadores numéricos
- Problema:
jjjjj
en lugar de5j
- Solución: Conscientemente cuenta y usa números
3. No practicar f/F/t/T
- Problema: Solo usar
w
yb
- Solución: Forzarte a usar búsqueda en línea
🎯 Benchmark de velocidad
Cuando domines los movimientos deberías poder:
- Ir a cualquier palabra visible en ~2 movimientos
- Navegar un archivo de 100 líneas en ~5 segundos
- Moverte sin pensar conscientemente en las teclas
🔜 ¿Qué sigue?
En el próximo capítulo aprenderemos la edición básica: cómo insertar, borrar y cambiar texto de manera eficiente usando los movimientos que acabamos de aprender.
💡 Tip pro: Los primeros días serán frustrantes. Es normal. Después de una semana será natural, y después de un mes serás más rápido que con el mouse.
🎯 Objetivo del capítulo: Navegar fluidamente por cualquier archivo usando solo el teclado.