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