|
| 1 | +Title: Una odisea de depuración top-down con VIM. |
| 2 | +Tags: jrnl, vim |
| 3 | +Date: 2013-08-27 |
| 4 | + |
| 5 | + |
| 6 | + |
| 7 | +[Jrnl](https://jrnl.sh/en/stable/) es un proyecto que permite a las personas llevar un diario desde la línea de comandos. Proporciona una plataforma segura y fácil de usar para escribir y organizar tus pensamientos, recuerdos y experiencias. |
| 8 | + |
| 9 | +Por otro lado, [Termux](https://termux.com/) es una aplicación de terminal de código abierto para dispositivos Android que permite a los usuarios ejecutar comandos y acceder a un entorno similar a una terminal de Linux en sus dispositivos móviles. |
| 10 | + |
| 11 | +En este post, describiré el proceso que seguí para configurar un número de columnas fijo cuando VIM abriese ficheros de tipo JRNL y así escribir desde el teléfono gracias a termux. Y cómo durante el proceso encontré un bug en una [biblioteca externa que acabé corrigiendo](https://github.com/raimon49/requirements.txt.vim) |
| 12 | + |
| 13 | +Yo utilizaba VIM con mi configuración antigua de `~/.vimrc`, la siguiente línea: |
| 14 | + |
| 15 | +```vim |
| 16 | +au BufRead,BufNewFile *.txt setlocal tw=50 |
| 17 | +``` |
| 18 | + |
| 19 | +El problema consistía en que ahora mi `~/.vimrc` venía dado por [Vim-bootstrap](https://vim-bootstrap.com/), un generador de configuraciones de Vim. |
| 20 | + |
| 21 | +Investigando, descubrí un método para ver el fichero en el que una variable en VIM fue asigada por última vez. |
| 22 | + |
| 23 | +```vim |
| 24 | +:verbose set tw |
| 25 | +``` |
| 26 | + |
| 27 | +Así pues, en nuestro caso es el `vim.vim` del `ftplugin`. Por cierto, para cargar el `.vimrc`sin reiniciar VIM |
| 28 | +se puede usar `:so ~/.vim/vimrc` o si se está en el propio archvo `:so %`. |
| 29 | + |
| 30 | +Si no usamos el archivo `~/.vim/vimrc` de *Vim-Bootstrap*, podemos trabajar más facilmente con la depuración de VIM. |
| 31 | + |
| 32 | +Cómo no era capaz de encontrar el fallo, acabé [preguntando en Stackoverflow](https://stackoverflow.com/questions/45905694 execute-a-line-in-vimrc-at-the-end). Donde comuniqué lo que había intentado y cuál era mi hipótesis. |
| 33 | + |
| 34 | +Tuve la suerte de que me respondieran e intenté reproducir sus instruciones: |
| 35 | + |
| 36 | +- Escribo en vimrc |
| 37 | + |
| 38 | + |
| 39 | +```vim |
| 40 | +au BufRead, BufNewFile jrnl*.txt set filetype=jrnl |
| 41 | +``` |
| 42 | + |
| 43 | +- Añado en la carpeta `~/.vim/ftplugin` |
| 44 | + |
| 45 | +```vim |
| 46 | +set formatoptions+=t |
| 47 | +set textwidth=50 |
| 48 | +``` |
| 49 | + |
| 50 | +Entonces, comenté todos los plugins y compruebo que funcionaba sin los plugins de `Vim-bootstrap`. Posteriormente, fui añadiendo uno a uno los plugins para encontrar el que generaba el problema. |
| 51 | + |
| 52 | +**¡Capturado la biblioteca culpable!** El plugin requirements.txt.vim es el encargado de sobreescribir la configuración. Cuando está activo, Vim no llama `~/.vim/after/ftplugin/jrnl.vim` |
| 53 | + |
| 54 | +Inspeccionando el código de requirements.txt.vim |
| 55 | +vemos que la *línea 37* contiene lo siguiente: |
| 56 | + |
| 57 | +```vim |
| 58 | +au BufNewFile,BufRead *.{txt,ini} if |
| 59 | +s:isRequirementsFile() | set ft=requirements |
| 60 | +``` |
| 61 | + |
| 62 | +Es decir, que la función `isRequirementsFile()` es |
| 63 | +llamada cada vez que se ejecuta un `*.txt.` |
| 64 | + |
| 65 | +```vim |
| 66 | +function! s:isRequirementsFile() |
| 67 | + let l:filename = expand("%:p") |
| 68 | + |
| 69 | + return Requirements_matched_filename(l:filename) |
| 70 | +endfunction |
| 71 | + |
| 72 | +function! Requirements_matched_filename(filename) |
| 73 | + if a:filename =~# '\v.*require(ment)?s\.(txt|in)$' |
| 74 | + return 1 |
| 75 | + endif |
| 76 | +
|
| 77 | + if a:filename =~# '\vrequire(ment)?s/.*\.(txt|in)$' |
| 78 | + return 1 |
| 79 | + endif |
| 80 | +
|
| 81 | + if a:filename =~# '\vconstraints\.(txt|in)$' |
| 82 | + return 1 |
| 83 | + endif |
| 84 | +
|
| 85 | + if len(g:requirements#detect_filename_pattern) |
| 86 | + \ && a:filename =~# g:requirements#detect_filename_pattern |
| 87 | + return 1 |
| 88 | + endif |
| 89 | + |
| 90 | + return 0 |
| 91 | +endfunction |
| 92 | +``` |
| 93 | + |
| 94 | +Como vemos, esta función crea una variable `filename` que contiene la ruta completa del archivo. Devuelve el resultado de aplicarle la función `Requirements_matched_filename` a la ruta. Comprobamos que la función `isReq` devolvía 0. Por |
| 95 | +lo tanto, el *bug parecía inencontrable...* |
| 96 | + |
| 97 | +Fue entonces cuando se me ocurrió la, quizás obvia pero efectiva, idea de [leer la documentación de la sintaxis de vim](https://vimdoc.sourceforge.net/htmldoc/syntax.html) y nos sorprendemos al ver que a la instrucción |
| 98 | + |
| 99 | +```vim |
| 100 | +au BufNewFile,BufRead *.{txt,ini} if |
| 101 | + s:isRequirementsFile() | set ft=requirements |
| 102 | +``` |
| 103 | + |
| 104 | +**¡le lalta un endif!** |
| 105 | + |
| 106 | +```vim |
| 107 | +au BufNewFile,BufRead *.{txt,ini} if |
| 108 | + s:isRequirementsFile() | set ft=requirements | |
| 109 | +endif |
| 110 | +``` |
| 111 | + |
| 112 | +En efecto, la simple ausencia de un `endif` en uno de los plugins de configuración estaba sobreescribiendo nuestra orden. |
| 113 | + |
| 114 | +Luego, me propuse a escribir un Pull Request que fue aceptado inmediatamente. |
| 115 | + |
| 116 | +> **Comentario del futuro:** |
| 117 | + La nueva versión de JRNL abre los archivos en |
| 118 | + formato `.jrnl`. Ahora basta con cambiar el `au BufNewFil` a `*.jrnl` para que |
| 119 | + funcione. |
0 commit comments