The XDG Base Directory Specification outlines a consistent standard for
applications to write runtime files. Teaching vim
to respect it is
non-trivial, so I’ve simplified the set up here.
You use vim
as your primary editor and take active measures in keeping your
$HOME
directory organised. vim
is one of those “traditional” apps that
stores it’s runtime files in a myriad of places. Thankfully, it’s customisable
enough to solve this.
As per my set up, add the following to your vimrc
:
" Environment
set directory=$XDG_CACHE_HOME/vim,~/,/tmp
set backupdir=$XDG_CACHE_HOME/vim,~/,/tmp
set viminfo+=n$XDG_CACHE_HOME/vim/viminfo
set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIM,$VIMRUNTIME
let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc"
… overriding ~/.vimrc
’s location by exporting $VIMINIT
in your shell’s
start-up file (perhaps ~/.bashrc
):
# Set vimrc's location and source it on vim startup
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'
First up, recognise those god-damn .swp
files cluttering up your project
directories? Let’s get rid of them for a start. Consulting :help swap
reveals the files are stored in dir[ectory]
.
:set dir
returns the current setup, which for me is:
directory=.,~/tmp,/var/tmp,/tmp
Now, lets override that by adding the following in $MYVIMRC
(usually
~/.vimrc
):
set directory=$XDG_CACHE_HOME/vim,~/,/tmp
Next, the .bak
files. Similarly, add the following to your vimrc
:
set backupdir=$XDG_CACHE_HOME/vim,~/,/tmp
Ever do a ls -la ~
and see a flood of strange-looking .viminfo
files? That
file is used (among other things) to store history and search terms. Thankfully,
as :h viminfo-file-name
mentions, we can specify a different location like so:
set viminfo+=n$XDG_CACHE_HOME/vim/viminfo
Next, the runtime directory, ~/.vim
. Since we likely want to use the global
resources (colours, syntax files and the like), it’s a good idea to replicate
the default runtime (check with :set runtime
). My setup looks like:
set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIM,$VIMRUNTIME
The last piece in the puzzle is to override the ~/.vimrc
location itself. You
could set an alias, such as:
alias vim='vim -u "$XDG_CONFIG_HOME/vim/vimrc"'
… but this will only work for the currently active terminal session and not if
vim
is launched some other way (via mutt
or dmenu
for example).
A more complete solution is to set VIMINIT
like so:
export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC'