Saltar al contenido principal

Autocompletado y Herramientas de Desarrollo

Vim puede convertirse en un entorno de desarrollo completo con las herramientas adecuadas. En este capítulo aprenderás a configurar autocompletado inteligente, linting, debugging y otras herramientas esenciales para desarrollo profesional.

🧠 Autocompletado Nativo de Vim

Vim incluye varias formas de autocompletado sin necesidad de plugins.

Tipos de completado nativo

" En modo Insert:
Ctrl-n " Siguiente palabra (keyword completion)
Ctrl-p " Palabra anterior
Ctrl-x Ctrl-l " Completado de línea completa
Ctrl-x Ctrl-f " Completado de nombres de archivo
Ctrl-x Ctrl-k " Completado de diccionario
Ctrl-x Ctrl-t " Completado de thesaurus
Ctrl-x Ctrl-i " Completado de archivos incluidos
Ctrl-x Ctrl-] " Completado de tags
Ctrl-x Ctrl-o " Omni completion (contextual)
Ctrl-x Ctrl-u " User completion (personalizado)
Ctrl-x Ctrl-s " Completado de spelling

Configuración del completado nativo

" Configuración básica de completado
set completeopt=longest,menuone,preview
set complete=.,w,b,u,t,i,kspell
set pumheight=15 " Altura del menú popup
set shortmess+=c " No mostrar mensajes de completado

" Configuración de tags para completado
set tags=./tags,tags,../tags

" Habilitar omni completion para diferentes lenguajes
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP

Diccionarios personalizados

" Agregar diccionarios específicos
set dictionary+=/usr/share/dict/words
set dictionary+=~/.vim/dict/programming.dict

" Crear diccionario personalizado para tu proyecto
" ~/.vim/dict/myproject.dict contiene:
" function
" variable
" component
" service
" controller

🔧 Herramientas de Desarrollo Esenciales

1. ALE (Asynchronous Lint Engine)

Instalación y configuración básica

" En tu .vimrc con vim-plug
Plug 'dense-analysis/ale'

" Configuración básica
let g:ale_completion_enabled = 1
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚠'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'

" Linters por lenguaje
let g:ale_linters = {
\ 'javascript': ['eslint', 'tsserver'],
\ 'python': ['flake8', 'pylint', 'mypy'],
\ 'go': ['gofmt', 'golint', 'go vet'],
\ 'rust': ['cargo', 'rls'],
\ 'vim': ['vint'],
\ 'yaml': ['yamllint'],
\ 'dockerfile': ['hadolint'],
\}

" Fixers automáticos
let g:ale_fixers = {
\ '*': ['remove_trailing_lines', 'trim_whitespace'],
\ 'javascript': ['eslint', 'prettier'],
\ 'python': ['black', 'isort'],
\ 'go': ['gofmt', 'goimports'],
\ 'rust': ['rustfmt'],
\}

" Auto-fix al guardar
let g:ale_fix_on_save = 1

" Navegación entre errores
nmap <silent> [e <Plug>(ale_previous_wrap)
nmap <silent> ]e <Plug>(ale_next_wrap)

2. Tags y Navegación de Código

Configuración de ctags

# Instalar universal-ctags (mejor que ctags)
# macOS
brew install universal-ctags

# Ubuntu/Debian
apt install universal-ctags

# Generar tags para proyecto
ctags -R --exclude=node_modules --exclude=.git .

Configuración en Vim

" Configuración de tags
set tags=./tags,tags,../tags,../../tags

" Mapeos para navegación
nnoremap <C-]> g<C-]> " Ir a definición (con menú si múltiples)
nnoremap <C-t> <C-t> " Volver
nnoremap <Leader>] :tag<Space> " Buscar tag específico

" Regenerar tags automáticamente
autocmd BufWritePost *.py,*.js,*.go,*.rs silent! !ctags -R . &

3. Autocompletado Avanzado con YouCompleteMe

Instalación (alternativa robusta)

" NOTA: YCM requiere compilación y es complejo
" Solo usar si necesitas completado muy avanzado
Plug 'ycm-core/YouCompleteMe', { 'do': './install.py --all' }

" Configuración básica
let g:ycm_key_list_select_completion = ['<C-n>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-p>', '<Up>']
let g:ycm_autoclose_preview_window_after_completion = 1
let g:ycm_autoclose_preview_window_after_insertion = 1

" Ir a definición
nnoremap <Leader>gd :YcmCompleter GoToDefinition<CR>
nnoremap <Leader>gr :YcmCompleter GoToReferences<CR>
nnoremap <Leader>gt :YcmCompleter GetType<CR>

4. Autocompletado Simple con mucpomplete

Configuración ligera (recomendado para Vim clásico)

" Plugin ligero y eficiente
Plug 'lifepillar/vim-mucomplete'

" Configuración
set completeopt+=menuone,noselect
let g:mucomplete#enable_auto_at_startup = 1
let g:mucomplete#completion_delay = 1

" Cadena de completado personalizada
let g:mucomplete#chains = {
\ 'default': ['path', 'omni', 'keyn', 'dict', 'uspl'],
\ 'vim': ['path', 'cmd', 'keyn']
\ }

🐍 Configuración por Lenguaje

Python

" Configuración específica para Python
autocmd FileType python setlocal ts=4 sw=4 expandtab

" Plugin para Python (opcional)
Plug 'vim-python/python-syntax'
Plug 'Vimjas/vim-python-pep8-indent'

" Configuración de python-syntax
let g:python_highlight_all = 1

" Ejecutar Python
autocmd FileType python nnoremap <buffer> <F5> :w<CR>:!python3 %<CR>

" Debugging con pdb
autocmd FileType python nnoremap <buffer> <Leader>b Oimport pdb; pdb.set_trace()<Esc>

" Virtual environments
if has('python3')
let g:python3_host_prog = expand('~/.pyenv/versions/neovim/bin/python')
endif

JavaScript/TypeScript

" Configuración para JS/TS
autocmd FileType javascript,typescript setlocal ts=2 sw=2 expandtab

" Plugins recomendados
Plug 'pangloss/vim-javascript'
Plug 'leafgarland/typescript-vim'
Plug 'MaxMEllon/vim-jsx-pretty'

" Configuración de vim-javascript
let g:javascript_plugin_jsdoc = 1
let g:javascript_plugin_ngdoc = 1
let g:javascript_plugin_flow = 1

" Ejecutar Node.js
autocmd FileType javascript nnoremap <buffer> <F5> :w<CR>:!node %<CR>

" Formateo con prettier (requiere ALE o comando externo)
autocmd FileType javascript,typescript nnoremap <buffer> <Leader>f :!prettier --write %<CR>

Go

" Plugin para Go
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

" Configuración específica
autocmd FileType go setlocal ts=4 sw=4 noexpandtab

" Configuración de vim-go
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_fields = 1
let g:go_highlight_types = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_fmt_command = "goimports"
let g:go_auto_type_info = 1

" Mapeos para Go
autocmd FileType go nnoremap <Leader>r :GoRun<CR>
autocmd FileType go nnoremap <Leader>b :GoBuild<CR>
autocmd FileType go nnoremap <Leader>t :GoTest<CR>
autocmd FileType go nnoremap <Leader>c :GoCoverageToggle<CR>

Rust

" Plugin para Rust
Plug 'rust-lang/rust.vim'

" Configuración
let g:rustfmt_autosave = 1
let g:rust_clip_command = 'pbcopy'

" Ejecutar Rust
autocmd FileType rust nnoremap <buffer> <F5> :w<CR>:!cargo run<CR>
autocmd FileType rust nnoremap <buffer> <Leader>t :!cargo test<CR>
autocmd FileType rust nnoremap <buffer> <Leader>c :!cargo check<CR>

🔍 Debugging en Vim

Debugging básico

" Plugin para debugging (vimspector)
Plug 'puremourning/vimspector'

" Configuración básica
let g:vimspector_enable_mappings = 'HUMAN'

" Mapeos personalizados
nnoremap <Leader>dd :call vimspector#Launch()<CR>
nnoremap <Leader>de :call vimspector#Reset()<CR>
nnoremap <Leader>dc :call vimspector#Continue()<CR>
nnoremap <Leader>dt :call vimspector#ToggleBreakpoint()<CR>
nnoremap <Leader>dT :call vimspector#ClearBreakpoints()<CR>

Debugging por lenguaje

Python con pdb

" Insertar breakpoint
function! InsertPythonBreakpoint()
let line = getline('.')
let indent = matchstr(line, '^\s*')
call append(line('.'), indent . 'import pdb; pdb.set_trace()')
endfunction

autocmd FileType python nnoremap <buffer> <Leader>b :call InsertPythonBreakpoint()<CR>

JavaScript con console.log

" Insertar console.log rápido
function! InsertJSLog()
let word = expand('<cword>')
let line = getline('.')
let indent = matchstr(line, '^\s*')
call append(line('.'), indent . 'console.log("' . word . ':", ' . word . ');')
endfunction

autocmd FileType javascript nnoremap <buffer> <Leader>l :call InsertJSLog()<CR>

🧪 Testing Integrado

Configuración para diferentes frameworks

Python - pytest

" Ejecutar tests
autocmd FileType python nnoremap <buffer> <Leader>ta :!pytest<CR>
autocmd FileType python nnoremap <buffer> <Leader>tf :!pytest %<CR>
autocmd FileType python nnoremap <buffer> <Leader>tc :!pytest -k <cword><CR>

" Plugin para testing (opcional)
Plug 'vim-test/vim-test'

" Configuración de vim-test
let test#strategy = "vimterminal"
let test#python#pytest#options = '-v'

nmap <silent> <Leader>tn :TestNearest<CR>
nmap <silent> <Leader>tf :TestFile<CR>
nmap <silent> <Leader>ts :TestSuite<CR>
nmap <silent> <Leader>tl :TestLast<CR>

JavaScript - Jest

autocmd FileType javascript nnoremap <buffer> <Leader>ta :!npm test<CR>
autocmd FileType javascript nnoremap <buffer> <Leader>tf :!npm test -- %<CR>
autocmd FileType javascript nnoremap <buffer> <Leader>tw :!npm test -- --watch<CR>

📝 Snippets y Templates

UltiSnips (motor de snippets potente)

Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

" Configuración
let g:UltiSnipsExpandTrigger="<Tab>"
let g:UltiSnipsJumpForwardTrigger="<Tab>"
let g:UltiSnipsJumpBackwardTrigger="<S-Tab>"
let g:UltiSnipsEditSplit="vertical"

" Directorio personalizado para snippets
let g:UltiSnipsSnippetsDir="~/.vim/UltiSnips"

Snippets personalizados

" Crear ~/.vim/UltiSnips/python.snippets
snippet def "Function definition"
def ${1:function_name}(${2:args}):
"""${3:Docstring}"""
${4:pass}
endsnippet

snippet class "Class definition"
class ${1:ClassName}:
"""${2:Docstring}"""

def __init__(self${3:, args}):
${4:pass}
endsnippet

⚙️ Configuración Completa de Ejemplo

.vimrc para desarrollo

" ============================================================================
" PLUGINS PARA DESARROLLO
" ============================================================================

call plug#begin('~/.vim/plugged')

" Autocompletado y análisis
Plug 'dense-analysis/ale' " Linting asíncrono
Plug 'lifepillar/vim-mucomplete' " Autocompletado ligero

" Lenguajes específicos
Plug 'vim-python/python-syntax' " Python syntax
Plug 'pangloss/vim-javascript' " JavaScript
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } " Go
Plug 'rust-lang/rust.vim' " Rust

" Snippets
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

" Testing
Plug 'vim-test/vim-test'

" Utilidades
Plug 'tpope/vim-commentary'
Plug 'tpope/vim-surround'
Plug 'jiangmiao/auto-pairs'

call plug#end()

" ============================================================================
" CONFIGURACIÓN DE DESARROLLO
" ============================================================================

" Completado
set completeopt=longest,menuone,preview
let g:mucomplete#enable_auto_at_startup = 1

" ALE
let g:ale_completion_enabled = 1
let g:ale_fix_on_save = 1
let g:ale_linters = {
\ 'python': ['flake8', 'mypy'],
\ 'javascript': ['eslint'],
\ 'go': ['gofmt', 'golint'],
\}

" UltiSnips
let g:UltiSnipsExpandTrigger="<Tab>"
let g:UltiSnipsJumpForwardTrigger="<Tab>"
let g:UltiSnipsJumpBackwardTrigger="<S-Tab>"

" Testing
let test#strategy = "vimterminal"
nmap <Leader>tn :TestNearest<CR>
nmap <Leader>tf :TestFile<CR>

" Tags
set tags=./tags,tags

📝 Ejercicios Prácticos

Ejercicio 1: Setup básico de desarrollo

  1. Configura ALE para tu lenguaje principal
  2. Instala y configura autocompletado
  3. Genera tags para un proyecto existente
  4. Prueba navegación con Ctrl-] y Ctrl-t

Ejercicio 2: Debugging workflow

  1. Configura debugging para tu lenguaje
  2. Crea funciones para insertar breakpoints rápidamente
  3. Practica debugging de un programa simple
  4. Documenta tu workflow personal

Ejercicio 3: Testing integrado

  1. Configura vim-test para tu framework
  2. Crea atajos para ejecutar tests
  3. Practica TDD dentro de Vim
  4. Configura auto-ejecución de tests

Ejercicio 4: Snippets personalizados

  1. Crea 5 snippets para tu lenguaje favorito
  2. Incluye snippets para patrones comunes
  3. Crea plantillas para diferentes tipos de archivo
  4. Practica uso eficiente de snippets

🏆 Tips Pro

1. Performance con proyectos grandes

" Optimizar para proyectos grandes
set synmaxcol=200 " Limitar highlighting
let g:ale_lint_on_text_changed = 'never' " Solo lint al guardar
set updatetime=1000 " Menos actualizaciones frecuentes

2. Configuración por proyecto

" .vimrc.local en cada proyecto
if filereadable('.vimrc.local')
source .vimrc.local
endif

" Ejemplo .vimrc.local:
" let g:ale_python_flake8_options = '--max-line-length=120'
" let g:test#python#pytest#options = '-x -v'

3. Integración con herramientas externas

" Formatear con herramientas externas
nnoremap <Leader>fp :!black %<CR> " Python
nnoremap <Leader>fj :!prettier --write %<CR> " JavaScript
nnoremap <Leader>fg :!gofmt -w %<CR> " Go

4. Automatización con autocmd

" Auto-formatear al guardar
autocmd BufWritePre *.py execute ':!black %'
autocmd BufWritePre *.js execute ':!prettier --write %'

" Auto-ejecutar tests en archivos de prueba
autocmd BufWritePost *_test.py execute ':!pytest %'

¡Con estas herramientas de desarrollo tendrás un entorno profesional completo en Vim!