Saltar al contenido principal

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

ComandoAcciónCuándo usar
f{char}Buscar carácter hacia adelanteIr exactamente a un carácter visible
F{char}Buscar carácter hacia atrásRegresar a carácter anterior
t{char}Hasta carácter hacia adelantePosicionarse antes del carácter
T{char}Hasta carácter hacia atrásPosicionarse después del carácter
;Repetir último f/F/t/TContinuar búsqueda
,Repetir en dirección opuestaRegresar en búsqueda

Ejemplo práctico:

const result = calculateTotal(price, tax, discount);

Con cursor al inicio:

  • f( → va al paréntesis de apertura
  • f, → va a la primera coma
  • ; → va a la segunda coma
  • F( → regresa al paréntesis
  • t) → 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

ComandoAcciónDescripción
{Párrafo anteriorLínea vacía arriba
}Párrafo siguienteLínea vacía abajo
(Oración anteriorBusca . ! ?
)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

ComandoAcciónDescripción
maCrear marca 'a'Usar letras a-z
`aIr a marca 'a' (exacta)Línea y columna exacta
'aIr a línea de marca 'a'Solo inicio de línea
:marksVer todas las marcasLista de marcas activas

Marcas automáticas (muy útiles)

ComandoAcciónCuándo se crea
`.Última ediciónAl cambiar texto
`^Última posición InsertAl salir de Insert
``Posición antes del último saltoAl usar gg, G, /búsqueda
''Línea antes del último saltoVersió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

ComandoAcciónDescripción
Ctrl+oPosición anteriorComo "atrás" en navegador
Ctrl+iPosición siguienteComo "adelante" en navegador
:jumpsVer historial de saltosLista completa
ComandoAcciónUso típico
g;Cambio anteriorIr a última edición
g,Cambio siguienteAdelante en historial
:changesVer historial de cambiosDebug de ediciones

Ejemplo de workflow:

  1. Editas línea 50
  2. Saltas a línea 200 con 200G
  3. Editas algo ahí
  4. g; te lleva de vuelta a línea 50
  5. Ctrl+o te lleva a línea 200

🎢 Movimientos de pantalla

Scroll inteligente

ComandoAcciónVentaja
zzCentrar línea actualVer contexto arriba y abajo
ztLínea actual al topVer qué viene después
zbLínea actual al bottomVer qué vino antes

Scroll por contexto

ComandoAcciónCuándo usar
HTop de pantalla visibleIr al inicio visible
MMedio de pantalla visiblePunto de referencia
LBottom de pantalla visibleIr al final visible

Combinaciones poderosas:

  • zz + H → Centrar y luego ir al top visible
  • zt + L → Línea al top, luego ir al bottom
  • M → Siempre un punto de referencia rápido

🔍 Búsqueda avanzada

Búsqueda de palabras completas

ComandoAcciónDiferencia
*Buscar palabra bajo cursorPalabra completa hacia adelante
#Buscar palabra bajo cursorPalabra completa hacia atrás
g*Buscar parcial bajo cursorIncluye 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 solo user en userAge (palabra completa)
  • g* encuentra user en userName, userAge, y personalUserData

Búsqueda con patrones

ComandoAcciónEjemplo
/\<word\>Palabra exacta/\<user\> no encuentra userName
/word.*endPalabra hasta end/const.*= encuentra declaraciones
/^wordPalabra 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:

  1. Orientación: H, M, L para ver dónde estás en pantalla
  2. Salto grosso: {, } para moverte por bloques
  3. Precisión: f, t para posición exacta
  4. Memoria: Marcas para guardar posiciones importantes
  5. 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:

  1. Cursor al inicio, usar f: para ir al primer :
  2. Usar ; para ir al siguiente :
  3. Usar f# para ir al color hex
  4. 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:

  1. Marca posición en process method con ma
  2. Navega a clean_data con } o búsqueda
  3. Regresa con `a
  4. 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:

  1. Busca user con * (debería encontrar todas las instancias)
  2. Usa n y N para navegar
  3. Busca solo <div con /^<div
  4. Busca emails con /@.*\.com

🧠 Patrones mentales para movimientos

Piensa en capas:

  1. Archivo completo: gg, G, % (próximo capítulo)
  2. Pantalla: H, M, L, Ctrl+f, Ctrl+b
  3. Párrafo/bloque: {, }
  4. Línea: 0, ^, $, g_
  5. Palabra: w, b, e
  6. Carácter: f, t, h, l

Estrategia de navegación:

  1. ¿Dónde quiero ir? → Elige el nivel apropiado
  2. ¿Cómo llego grosso modo? → Salto grande primero
  3. ¿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.