Saltar al contenido principal

Navegación de Archivos y Exploración

La navegación eficiente de archivos es fundamental para trabajar productivamente en proyectos grandes. Vim ofrece múltiples formas de explorar y navegar por tu sistema de archivos, desde herramientas integradas hasta plugins especializados.

🗂️ Explorador Nativo: Netrw

Vim incluye Netrw, un explorador de archivos integrado que es sorprendentemente potente.

Abrir Netrw

:Explore      " Explorar directorio del archivo actual (:E)
:Sexplore " Explorar en división horizontal (:Sex)
:Vexplore " Explorar en división vertical (:Vex)
:Texplore " Explorar en nueva pestaña (:Tex)
<Enter>       " Entrar a directorio o abrir archivo
- " Subir al directorio padre
u " Subir en historial de directorios
U " Bajar en historial de directorios
gb " Ir al directorio bookmarked

Operaciones de archivos

d             " Crear directorio
D " Eliminar archivo/directorio
R " Renombrar archivo
% " Crear nuevo archivo
p " Vista previa de archivo
o " Abrir archivo en nueva ventana horizontal
v " Abrir archivo en nueva ventana vertical
t " Abrir archivo en nueva pestaña

Vistas de Netrw

i             " Cambiar entre vistas (tree, long, wide, thin)
s " Cambiar criterio de ordenamiento
r " Invertir orden

Configuración de Netrw

" En tu .vimrc
let g:netrw_banner = 0 " Ocultar banner
let g:netrw_liststyle = 3 " Vista de árbol
let g:netrw_browse_split = 4 " Abrir en ventana anterior
let g:netrw_altv = 1 " Abrir splits a la derecha
let g:netrw_winsize = 25 " Ancho del explorador
let g:netrw_list_hide = '\(^\|\s\s\)\zs\.\S\+' " Ocultar archivos ocultos

🔍 Búsqueda de Archivos

Find nativo

:find archivo.txt     " Buscar archivo en 'path'
:find **/*test* " Buscar con wildcards

Configurar path para find

" En .vimrc
set path+=** " Buscar recursivamente
set wildmenu " Mejor autocompletado
set wildignore+=*/node_modules/*,*/build/*,*.pyc

Tags para navegación

" Generar tags
:!ctags -R .

" Navegar con tags
Ctrl-] " Ir a definición
Ctrl-t " Volver de definición
:tag función " Ir a tag específico
:tags " Ver stack de tags

🚀 Plugins de Navegación

1. fzf.vim (Recomendado)

Instalación con vim-plug:

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

Comandos principales:

:Files            " Buscar archivos
:GFiles " Buscar archivos en Git
:Buffers " Buscar entre buffers
:Rg " Buscar contenido (requiere ripgrep)
:Lines " Buscar líneas en buffers
:History " Historial de archivos

Configuración recomendada:

" Atajos para fzf
nnoremap <Leader>f :Files<CR>
nnoremap <Leader>b :Buffers<CR>
nnoremap <Leader>g :GFiles<CR>
nnoremap <Leader>r :Rg<CR>
nnoremap <Leader>l :Lines<CR>
nnoremap <Leader>h :History<CR>

" Ventana de fzf en popup
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }

2. NERDTree

Instalación:

Plug 'preservim/nerdtree'

Comandos básicos:

:NERDTree         " Abrir NERDTree
:NERDTreeToggle " Alternar NERDTree
:NERDTreeFind " Encontrar archivo actual

Navegación en NERDTree:

o             " Abrir archivo/directorio
go " Abrir archivo sin mover cursor
t " Abrir en nueva pestaña
T " Abrir en nueva pestaña sin cambiar
i " Abrir en split horizontal
gi " Abrir en split horizontal sin mover cursor
s " Abrir en split vertical
gs " Abrir en split vertical sin mover cursor

Configuración:

" Toggle NERDTree
nnoremap <Leader>n :NERDTreeToggle<CR>
nnoremap <Leader>nf :NERDTreeFind<CR>

" Configuración
let NERDTreeShowHidden=1
let NERDTreeQuitOnOpen=1
let NERDTreeMinimalUI=1

3. Ranger.vim

Para usuarios de Ranger:

Plug 'francoiscabrol/ranger.vim'

4. Telescope (para Neovim)

Solo para referencia, ya que nos enfocamos en Vim clásico:

-- Solo en Neovim
require('telescope').setup{}

📝 Ejercicios Prácticos

Ejercicio 1: Exploración básica con Netrw

  1. Abre Vim en el directorio de un proyecto
  2. Usa :Explore para abrir Netrw
  3. Navega por diferentes directorios
  4. Cambia entre vistas con i
  5. Crea un archivo nuevo con %
  6. Crea un directorio con d

Ejercicio 2: Búsqueda con find

  1. Configura path para incluir subdirectorios
  2. Usa :find para buscar archivos específicos
  3. Practica con wildcards: :find **/*test*
  4. Usa tab para autocompletar nombres

Ejercicio 3: Workflow con fzf (si está instalado)

  1. Instala fzf.vim siguiendo las instrucciones
  2. Usa :Files para búsqueda rápida
  3. Prueba :GFiles en un repositorio Git
  4. Busca contenido con :Rg (requiere ripgrep)
  5. Navega por buffers con :Buffers

Ejercicio 4: Tags para navegación

  1. En un proyecto con código, genera tags: :!ctags -R .
  2. Posiciónate sobre una función y presiona Ctrl-]
  3. Usa Ctrl-t para volver
  4. Prueba :tag nombre_función

🎯 Workflows Recomendados

Workflow 1: Solo herramientas nativas

" Configuración para navegación nativa eficiente
set path+=**
set wildmenu
set wildignore+=*/node_modules/*,*/build/*,*.pyc

" Atajos útiles
nnoremap <Leader>e :Explore<CR>
nnoremap <Leader>f :find **/*
nnoremap <Leader>b :buffers<CR>:buffer<Space>

Workflow 2: Con fzf

" Búsqueda ultra-rápida con fzf
nnoremap <C-p> :Files<CR>
nnoremap <C-b> :Buffers<CR>
nnoremap <C-f> :Rg<CR>

Workflow 3: Con NERDTree sidebar

" Panel lateral persistente
nnoremap <F2> :NERDTreeToggle<CR>
autocmd VimEnter * NERDTree | wincmd p

⚙️ Configuración Avanzada

Ignorar archivos específicos

" Para find nativo
set wildignore+=*.o,*~,*.pyc
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*
set wildignore+=*/node_modules/*,*/bower_components/*
set wildignore+=*/tmp/*,*.so,*.swp,*.zip

" Para Netrw
let g:netrw_list_hide= '.*\.pyc$,.*\.o$,.*\.so$,.*\.swp$,.*\.zip$'

Abrir archivos recientes

" Función personalizada para archivos recientes
function! s:MRU()
for file in v:oldfiles[0:9]
if filereadable(file)
echo fnamemodify(file, ':~:.')
endif
endfor
endfunction

command! MRU call s:MRU()
" Atajos para marcas globales
nnoremap <Leader>ma :marks<CR>
nnoremap <Leader>mg mG " Marcar como G (global)
nnoremap <Leader>mc mC " Marcar como C (config)
nnoremap <Leader>mt mT " Marcar como T (test)

🏆 Tips Pro

1. Combina herramientas

" Usar find + grep para búsqueda poderosa
:vimgrep /patrón/j **/*.py | copen

2. Sesiones para proyectos

" Guardar y restaurar estado completo
:mksession! proyecto.vim
vim -S proyecto.vim

3. Argumentos de línea de comandos

# Abrir múltiples archivos
vim $(find . -name "*.py" | head -10)

# Con patrones
vim **/*.js

4. Integración con herramientas externas

" Usar find del sistema
:!find . -name "*.py" -exec vim {} +

5. Bookmarks en Netrw

" En Netrw, usar 'mb' para bookmarkar
" Usar 'gb' para ir a bookmark

🔧 Troubleshooting

Problemas comunes

Find no encuentra archivos

" Verificar configuración de path
:set path?

" Agregar directorios específicos
:set path+=src/**,tests/**

Netrw muy lento

" Deshabilitar plugins innecesarios
let g:loaded_netrwPlugin = 1

fzf no funciona

# Instalar dependencias
brew install fzf ripgrep # macOS
apt install fzf ripgrep # Ubuntu

📚 Recursos Adicionales

  • :help netrw - Documentación completa de Netrw
  • :help find - Documentación del comando find
  • :help path - Configuración de rutas de búsqueda
  • fzf.vim GitHub - Documentación de fzf.vim

¡La navegación eficiente de archivos es clave para la productividad! Experimenta con diferentes métodos y encuentra el workflow que mejor se adapte a tu estilo de trabajo.