107. Movimientos avanzados: words, lines, paragraphs 🥷
Más allá de hjkl
Ya dominas los movimientos básicos, ahora es hora de aprender los movimientos que realmente te harán rápido. Estos movimientos te permitirán navegar por archivos grandes como si fueran pequeños.
🎯 Movimientos de precisión
Saltos directos
Comando | Acción | Cuándo usar |
---|---|---|
f{char} | Buscar carácter hacia adelante | Ir exactamente a un carácter visible |
F{char} | Buscar carácter hacia atrás | Regresar a carácter anterior |
t{char} | Hasta carácter hacia adelante | Posicionarse antes del carácter |
T{char} | Hasta carácter hacia atrás | Posicionarse después del carácter |
; | Repetir último f/F/t/T | Continuar búsqueda |
, | Repetir en dirección opuesta | Regresar en búsqueda |
Ejemplo práctico:
const result = calculateTotal(price, tax, discount);
Con cursor al inicio:
f(
→ va al paréntesis de aperturaf,
→ va a la primera coma;
→ va a la segunda comaF(
→ regresa al paréntesist)
→ va justo antes del paréntesis de cierre
Búsqueda de 2 caracteres con /
/ca " Busca 'ca' - va a 'calculateTotal'
/pr " Busca 'pr' - va a 'price'
📐 Movimientos por estructura de texto
Párrafos y bloques
Comando | Acción | Descripción |
---|---|---|
{ | Párrafo anterior | Línea vacía arriba |
} | Párrafo siguiente | Línea vacía abajo |
( | Oración anterior | Busca . ! ? |
) | Oración siguiente | Útil en texto narrativo |
Ejemplo con código:
def process_data(data):
"""Process the input data"""
cleaned_data = clean(data)
validated_data = validate(cleaned_data)
return validated_data
def save_data(data):
"""Save data to database"""
db.save(data)
log.info("Data saved successfully")
{
desde cualquier línea de la primera función → va al inicio del archivo}
desde primera función → va a la línea vacía entre funciones}
otra vez → va al final del archivo
🏷️ Marcas (Marks) - Navegación con memoria
Marcas manuales
Comando | Acción | Descripción |
---|---|---|
ma | Crear marca 'a' | Usar letras a-z |
`a | Ir a marca 'a' (exacta) | Línea y columna exacta |
'a | Ir a línea de marca 'a' | Solo inicio de línea |
:marks | Ver todas las marcas | Lista de marcas activas |
Marcas automáticas (muy útiles)
Comando | Acción | Cuándo se crea |
---|---|---|
`. | Última edición | Al cambiar texto |
`^ | Última posición Insert | Al salir de Insert |
`` | Posición antes del último salto | Al usar gg, G, /búsqueda |
'' | Línea antes del último salto | Versión de línea completa |
Workflow con marcas:
def long_function():
# ... 100 líneas de código ...
if condition:
ma # Marcar esta posición como 'a'
# ... navegar por el archivo ...
# ... hacer cambios en otras partes ...
`a # Regresar exactamente aquí
🔄 Navegación por cambios
Historial de posiciones
Comando | Acción | Descripción |
---|---|---|
Ctrl+o | Posición anterior | Como "atrás" en navegador |
Ctrl+i | Posición siguiente | Como "adelante" en navegador |
:jumps | Ver historial de saltos | Lista completa |
Navegación por cambios de texto
Comando | Acción | Uso típico |
---|---|---|
g; | Cambio anterior | Ir a última edición |
g, | Cambio siguiente | Adelante en historial |
:changes | Ver historial de cambios | Debug de ediciones |
Ejemplo de workflow:
- Editas línea 50
- Saltas a línea 200 con
200G
- Editas algo ahí
g;
te lleva de vuelta a línea 50Ctrl+o
te lleva a línea 200
🎢 Movimientos de pantalla
Scroll inteligente
Comando | Acción | Ventaja |
---|---|---|
zz | Centrar línea actual | Ver contexto arriba y abajo |
zt | Línea actual al top | Ver qué viene después |
zb | Línea actual al bottom | Ver qué vino antes |
Scroll por contexto
Comando | Acción | Cuándo usar |
---|---|---|
H | Top de pantalla visible | Ir al inicio visible |
M | Medio de pantalla visible | Punto de referencia |
L | Bottom de pantalla visible | Ir al final visible |
Combinaciones poderosas:
zz
+H
→ Centrar y luego ir al top visiblezt
+L
→ Línea al top, luego ir al bottomM
→ Siempre un punto de referencia rápido
🔍 Búsqueda avanzada
Búsqueda de palabras completas
Comando | Acción | Diferencia |
---|---|---|
* | Buscar palabra bajo cursor | Palabra completa hacia adelante |
# | Buscar palabra bajo cursor | Palabra completa hacia atrás |
g* | Buscar parcial bajo cursor | Incluye coincidencias parciales |
g# | Buscar parcial hacia atrás | Útil para prefijos/sufijos |
Ejemplo:
const userName = "alice";
const userAge = 25;
const personalUserData = getUserData();
Con cursor en user
de la primera línea:
*
encuentra solouser
enuserAge
(palabra completa)g*
encuentrauser
enuserName
,userAge
, ypersonalUserData
Búsqueda con patrones
Comando | Acción | Ejemplo |
---|---|---|
/\<word\> | Palabra exacta | /\<user\> no encuentra userName |
/word.*end | Palabra hasta end | /const.*= encuentra declaraciones |
/^word | Palabra al inicio de línea | /^def encuentra funciones Python |
/word$ | Palabra al final de línea | /;$ encuentra líneas que terminan en ; |
🎯 Movimientos combinados
Patrones eficientes
" Ir al final de función JavaScript
/}$
" Buscar siguiente comentario
/\/\/
" Ir a siguiente import
/^import
" Buscar siguiente asignación
/=.*$
Workflow de navegación rápida:
- Orientación:
H
,M
,L
para ver dónde estás en pantalla - Salto grosso:
{
,}
para moverte por bloques - Precisión:
f
,t
para posición exacta - Memoria: Marcas para guardar posiciones importantes
- Contexto:
zz
,zt
,zb
para mejor vista
💪 Ejercicios prácticos
Ejercicio 1: Navegación con f/t
.container {
display: flex;
justify-content: center;
align-items: center;
background-color: #f0f0f0;
border: 1px solid #ccc;
}
Tareas:
- Cursor al inicio, usar
f:
para ir al primer:
- Usar
;
para ir al siguiente:
- Usar
f#
para ir al color hex - Usar
t;
para ir justo antes del;
Ejercicio 2: Marcas y navegación
class DataProcessor:
def __init__(self, config):
self.config = config
def process(self, data):
ma # Marca aquí
cleaned = self.clean_data(data)
validated = self.validate_data(cleaned)
`a # Regresa a la marca
return validated
def clean_data(self, data):
# ... 50 líneas de código ...
pass
def validate_data(self, data):
# ... 30 líneas de código ...
pass
Tareas:
- Marca posición en
process
method conma
- Navega a
clean_data
con}
o búsqueda - Regresa con
`a
- Usa
Ctrl+o
para navegar en historial
Ejercicio 3: Búsqueda avanzada
<div class="user-card">
<h2 class="user-name">Alice Smith</h2>
<p class="user-email">alice@example.com</p>
<span class="user-role">Administrator</span>
</div>
<div class="user-card">
<h2 class="user-name">Bob Johnson</h2>
<p class="user-email">bob@example.com</p>
<span class="user-role">User</span>
</div>
Tareas:
- Busca
user
con*
(debería encontrar todas las instancias) - Usa
n
yN
para navegar - Busca solo
<div
con/^<div
- Busca emails con
/@.*\.com
🧠 Patrones mentales para movimientos
Piensa en capas:
- Archivo completo:
gg
,G
,%
(próximo capítulo) - Pantalla:
H
,M
,L
,Ctrl+f
,Ctrl+b
- Párrafo/bloque:
{
,}
- Línea:
0
,^
,$
,g_
- Palabra:
w
,b
,e
- Carácter:
f
,t
,h
,l
Estrategia de navegación:
- ¿Dónde quiero ir? → Elige el nivel apropiado
- ¿Cómo llego grosso modo? → Salto grande primero
- ¿Cómo ajusto la precisión? → Movimiento fino después
🎯 Metas de dominio
Cuando domines estos movimientos:
- Puedes ir a cualquier lugar visible en 1-3 movimientos
- Navegas archivos de 1000+ líneas cómodamente
- Usas marcas para "teleportarte" entre secciones
- Combinas búsqueda con movimientos naturalmente
- El mouse se vuelve innecesario para navegación
🔜 ¿Qué sigue?
En el próximo capítulo aprenderemos búsqueda y reemplazo avanzado, incluyendo expresiones regulares y comandos de sustitución poderosos.
💡 Tip pro: Practica estos movimientos hasta que sean subconscientes. Tu cerebro debería pensar "quiero ir allí" y tus dedos deberían moverse automáticamente.
🎯 Objetivo del capítulo: Navegar por cualquier archivo como si fuera una extensión de tu mente.