Simple vim note setup
Tags: vim, productivity
Published: 2020-11-20 07:54:34

I have tried a few techniques in taking, organizing, and searching notes. I found the more notes I took the more difficult it was to find what I wanted, or keep them all organized. I decided to just let it slip and see what happens.  I finally hit a point where I needed a fuzzy finder to find what I was looking for. This led me to this simple setup with vim.

## Notes and where to keep them
First I needed a place to store my notes. I've tried file syncing software, which is fine but I really didn't want some process always on taking up resources. So I decided to use [gitlab](gitlab.com) wiki. Here is how I got setup:

Create a private repo in [gitlab](gitlab.com). Then clone that repo's `wiki` to your local machine. Here is an example of cloning a wiki. I cloned this to `$HOME` and will set it as an ENV var in the steps to follow.

```
git clone git@gitlab.com:myawesomeproject/notes.wiki
```

### side note
I don't like using auto command on exit/save to auto-commit the notes but that is an option. For now I do this manually as needed.

## Notes and how to find what you are looking for
Setup an ENV var in `~/.bash_profile` or `~/.bashrc` or where ever your operating system loads in ENV vars. I use this `export NOTES="$HOME/notes.wiki"` this just needs to be the path that the notes wiki was cloned to.

Add `fzf` as a vim plugin [Installing instructions](https://github.com/junegunn/fzf.vim#installation)

Create a helper method in the `vimrc` file. Then map `:Notes` to `<Leader>n`.

```
"------------------------------------------------
" Note search START
command! -bang -nargs=* Notes
  \ call fzf#vim#grep(
  \   'rg --column --line-number --no-heading --color=always --passthru "" $NOTES'.shellescape(<q-args>), 1,
  \   fzf#vim#with_preview(), <bang>0)

nmap <Leader>n :Notes<CR>
" Note search END
"------------------------------------------------
```

Reload vim and give it a try `:Notes` or `<Leader>n` will bring up all the notes from the defined `$NOTES` dir, and allow for fuzzy searching.

If you don't want to fuzzy search you can always run `:FZF $NOTES` inside of `vim` and search via file name.

## Optional FZF settings
Adding these setting will allow to toggle the preview window while invoking `fzf` in both your shell, or in `vim` by using `?` key.

This will also setup your shell to use `fzf` commands `ctrl + r`, and `ctrl + t`

For optimal performance I have installed (most package mangers have these tools available)
* [bat](https://github.com/sharkdp/bat) 
* [fzf](https://github.com/junegunn/fzf)
* [ripgrep](https://github.com/BurntSushi/ripgrep) 
* [fd](https://github.com/sharkdp/fd)

I have these settings in my `~/.bashrc` file:
```
export NOTES="$HOME/notes.wiki"

if [ ! -f "${HOME}/.key-bindings.bash" ]; then
  curl -sSL \
    https://raw.githubusercontent.com/junegunn/fzf/master/shell/key-bindings.bash \
    -o "${HOME}/.key-bindings.bash" \
    ;
fi

source "${HOME}/.key-bindings.bash"

export FZF_DEFAULT_COMMAND="fd"
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND --type file"
export FZF_ALT_C_COMMAND="$FZF_DEFAULT_COMMAND --type d"
export FZF_DEFAULT_OPTS="
--layout=reverse
--info=inline
--height=50%
--preview-window=:hidden
--preview '([[ -f {} ]] \
│·&& (bat --style=numbers --color=always {} \
│·|| cat {})) \
│·|| ([[ -d {} ]] && (tree -C {} | less)) \
│·|| echo {} 2> /dev/null | head -200'
--bind '?:toggle-preview'
"
```