Skip to content

Commit 309825d

Browse files
committed
Una odisea de depuración top-down con VIM
1 parent 5509d63 commit 309825d

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

blog/jrnl-vim.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
Title: Una odisea de depuración top-down con VIM.
2+
Tags: jrnl, vim
3+
Date: 2013-08-27
4+
5+
![Jrnl](/images/jrnl.png)
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

Comments
 (0)