FZF as Vim package
2020-09-22


As a Neovim user, I've been following the development of v0.5 with great
interest. Native LSP and Treesitter look like great solutions to problems users
clearly have. I've been slowly weaning myself off of coc.nvim in preparation for
when all of this hits stable.

Admittedly, coc.nvim is a great plugin/ecosystem, and works great.
Unfortunately, it's a bunch of heavy js blobs that depend on both npm **and**
yarn, which I've been tolerating for the sake of coc's features.

Speaking of features, in the past I've relied rather heavily on coc-lists as a
fuzzy finder, and coc-explorer for those hard to reach files.

I've (re)replaced coc-explored with Defx and decided it was time to bring FZF
back into my vim config, so off to its repo I went, to check back on the docs.

I've always thought the instructions to use FZF as a vim plugin were a bit
unclear and, as I discovered after a lengthy chat in #neovim, they actually are.
Nonetheless, I remembered using it without much hassle before.

As a vim-plug user, my proposed solution had been to add `Plug /usr/bin/fzf` to
the relevant part of my `init.vim`, but in the interests of going native as much
as possible, I've been giving the packages system a try.

The way to get native packages working is to create a couple of folders
somewhere in the `runtimepath` and just clone plugin repos in there. Some people
prefer using git submodules but I'm not entirely clear on the benefits of this
over cloning.  
I keep my plugins in `$XDG_DATA_HOME/nvim/site/pack/bundle` placing the ones I
always need loaded in the `start` folder, and the more specific ones in the
`opt` folder for lazy loading. The latter require adding `packadd!
plugin-folder-name` to `init.vim`.

This brings us back to the topic of FZF's docs. Having FZF installed through a
system-wide package manager gets us halfway there, but the docs state we should
have both the entire program and the vim plugin in our plugins directory... wat.

As it turns out, FZF proper already comes with a wrapper that enables us to use
it with vim (very confusingly called fzf.vim), but all of the premade functions
most of us are used to (such as `:Buffers`, `:Files`, etc), are only available
through the fzf.vim **plugin**. While this is more or less explained somewhere
in the docs, the recommended solution of managing the FZF application itself
through vim (thus having it installed _twice_) is bullshit and nonsense and just
plain WRONG.

What should be done is use `find` (or `fd` or `locate` or whatever) to find out
where this wrapper is installed and add that location to our `runtimepath`.  
`locate fzf` threw a bunch of directories at me, the most interesting one
being `/usr/share/vim/vimfiles` which is where the wrapper is in my system. The
actual path is somewhat longer but this is the part that's of relevance.  
So now it's possible to just clone the one repo and add a line to `init.vim`

### TL;DR

1. Install FZF through your system's package manager
2. Clone the plugin repo to the `runtimepath`. For Neovim, it looks like this:

```
$ 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. Find the relevant file
4. Add line to `init.vim` like so:

```
set runtimepath+=/usr/share/vim/vimfiles/
packadd! fzf.vim
...
```
5. ???
6. Profit!

The wrapper itself is inside a folder called `plugin` but if you add that to the
route, then the file won't be loaded. Go figure.

### Epilogue

I couldn't find any sign whatsoever of any of this ever being explained or
talked about in either FZF repo. What little is there either doesn't work or
just reiterates that you should just install everything twice. Whatever issues
have been opened have either come and gone or received answers so terse they
might as well have been SteveMail[^1]

[^1]: https://stevemail.tumblr.com/