FZF Como Vim Package
====================
22 de Septiembre, 2020
Como usuario de NeoVim, estoy bastante excitado con todo este tema
del LSP nativo y Treesitter, dos cosas que prometen muchísimo. Y en
preparación para cuando la version 0.5 (que viene con estas cosas)
sea estable, he comenzado a "destetarme" de coc.nvim.
Debo decir que coc.nvim la verdad es un gran plugin/ecosistema, y
que funciona excelentemente. También debo decir que como me dedico
mas que nada a JS y sus derivados, tener npm y yarn y todo eso es
algo con lo que tengo que vivir. Y ademas quiero ver que onda con
TypeScript eventualmente así que no creo que pueda andar
desinstalando nada de todo eso en ningún momento.
Pero me estoy yendo de tema, a lo que iba es que estoy empezando a
cortar mi dependencia en coc.nvim y sus agregados como por ejemplo
coc-lists, que en mi configuración hacia las veces de FZF, y
coc-explorer, que era usado para cuando tengo que buscar un archivo
que esta en la otra punta de mi sistema[1].
Ya había usado FZF antes, y si bien las instrucciones de
instalación del plugin de Vim siempre me parecieron poco claras
(finalmente resulta que **son** poco claras[2]), lo había podido
usar sin mayores problemas.
En ese momento yo usaba vim-plug para todas mis necesidades
pluginescas y mi solución fue agregar `Plug '/usr/bin/fzf'` a la
parte de mi `init.vim` donde se realizaba la carga de plugins, pero
de un tiempo a esta parte he decidido "modernizarme" y empezar a
aprovechar más las funcionalidades que (Neo)Vim ya trae por
defecto.
Una de ellas es el sistema de native packages, lo cual básicamente
consiste en crear un par de carpetas en alguna parte del
`runtimepath` y empezar a clonar los repos de los plugins en ellas.
Hay gente que en vez de solo clonar, usa git submodules pero la
verdad no entiendo bien como funciona eso o que beneficios trae.
Mis plugins están guardados en
`$XDG_DATA_HOME/nvim/site/pack/bundle`[3] en las carpetas `start`
para los que se cargan siempre al inicio, y `opt` para los que se
cargan on demand, teniendo en cuenta que es necesario agregar
`packadd! plugin-folder-name` en el `init.vim` para que estén
disponibles para su uso.
Y ahora volvemos al tema de la documentación de FZF. Si se da el
caso de que ya tenemos FZF instalado mediante el package manager de
nuestra distribución, entonces ya tenemos un pie adentro. Pero las
instrucciones dicen que hay que clonar el repo de la aplicación
**Y** el repo del plugin propiamente dicho...
¿Quí? ¡¿So' loco vo'?!
Y es que resulta que FZF (la aplicación standalone) ya trae un
wrapper (con el muy confuso nombre de fzf.vim...) que permite su
uso con Vim, pero todas las funciones ya armadas (me refiero a
`:Files` y `:Buffers` y las demás) solamente vienen con el
**plugin** fzf.vim. Aquí hago la salvedad de que este punto esta
mínimamente explicado en alguna parte de la documentación, y
también se habla de como uno podría crear sus propias funciones a
mano usando vimscript, pero en fin. La cuestión es que para tener
todo en un solo lugar se recomienda básicamente tener a la
aplicación en el sistema 2 veces. Esto es una pelotudez y un
despropósito y simplemente está MAL.
Lo que hay que hacer es, usando `find` (o `fd` o `locate` o algo
por el estilo), ver donde se instalo el wrapper de la aplicación, y
después incluir eso en nuestro `runtimepath`.
En mi sistema `locate fzf` tiró varios directorios y archivos,
entre ellos el necesario para toda esta historia, ubicado en
`/usr/share/vim/vimfiles/`[4]. En realidad la dirección es un poco
mas larga, pero la parte que nos importa es esa. Así que en vez de
clonar 2 cosas podemos simplemente clonar una y agregar una
instrucción a nuestro `init.vim`.
Tl;dr
-----
1. Instalar FZF mediante package manager.
2. Clonar un solo repo al `runtimepath`. Desconozco el `rtp` de
Vim, pero para NeoVim quedaría así:
```
$ mkdir -p $XDG_DATA_HOME/nvim/site/pack/bundle/opt
$ cd $XDG_DATA_HOME/nvim/site/pack/bundle/opt
$ git clone
https://github.com/junegunn/fzf.vim
```
3. Buscar el archivo. Conviene hacer una búsqueda general.
Recomiendo usar `locate` pero otras herramientas pueden
funcionar igual.
4. El `init.vim` queda así:
```
set runtimepath+=/usr/share/vim/vimfiles/
packadd! fzf.vim
..
```
5. ???
6. Profit!
Es necesario aclarar que el wrapper se encuentra metido en un
directorio llamado `plugin` dentro de `vimfiles` pero si agregamos
esa parte de la ruta, el archivo no carga. No tengo idea por que es
así.
Epílogo
-------
Nada de todo esto que yo escribí acá esta explicado en ninguno de
los 2 repos, las explicaciones que hay disponibles no funcionan (o
solo lo hacen para instalar la aplicación 2 veces), y los issues
que se han abierto al respecto han pasado sin pena ni gloria o
bien han recibido una respuesta digna de un SteveMail[5].
Tenia pensado abrir un issue hablando de todo esto en una manera
mucho más elocuente, pero la verdad que no se me ocurrió como
encararlo de una manera que se entienda. Tal vez lo reformule un
poco y lo haga.
[1] Antes de coc-explorer estuvo Defx (y mucho antes otros),
después fern.vim.
[2] Gracias a la gente de #neovim en freenode por aclararme esto.
[3] `$XDG_DATA_HOME` == `~/.local/share`.
[4] YMMV.
[5]
https://stevemail.tumblr.com