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
- Configura ALE para tu lenguaje principal
- Instala y configura autocompletado
- Genera tags para un proyecto existente
- Prueba navegación con
Ctrl-]
yCtrl-t
Ejercicio 2: Debugging workflow
- Configura debugging para tu lenguaje
- Crea funciones para insertar breakpoints rápidamente
- Practica debugging de un programa simple
- Documenta tu workflow personal
Ejercicio 3: Testing integrado
- Configura vim-test para tu framework
- Crea atajos para ejecutar tests
- Practica TDD dentro de Vim
- Configura auto-ejecución de tests
Ejercicio 4: Snippets personalizados
- Crea 5 snippets para tu lenguaje favorito
- Incluye snippets para patrones comunes
- Crea plantillas para diferentes tipos de archivo
- 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!