Advanced Vim Sessions
I have blogged before about vim sessions and how useful they are. This post is about a pattern I discovered (though I’m likely not the first to discover it) at work when frustrated that certain settings were not stored in the session.
Note (2017-05-24) : this post has a critical error, see the updated version instead.
So here was how my original frustration surfaced; I was using
Obsession, as I’ve mentioned before,
which automatically updates your session file periodically and saves open files,
window layouts, etc. One of the things I discovered that it does not save is
the path
.
If you recall, I discussed the incredible value of path
in a post about the
gf
feature. Because of gf
I tend to need path
to
be correctly set all the time.
For a long time I was sure that the path
was getting correctly saved by
Obsession and that I was just somehow clearing it (recall that I was having
system stability issues in general) but at some
point I was chatting with some coworkers and decided to track it down for sure.
One option is to modify the sessionoptions
setting.
I think simply doing set sessionoptions+=options
would work for this case, but
then you may end up persisting a lot more than you want. I just wanted this
one setting.
🔗 Nested Sessions
The idea I came up with was to nest sessions. I created an outer session, and it looks like this:
set path+=app/lib
source /home/frew/.vvar/sessions/_zr
So all it does is set the path
and then basically loads the inner session,
which enables all of the normal Obsession convenience.
That’s super convenient and goes a long way, but yesterday I thought of another
really useful pattern. You can load plugins or a set of plugins from a session;
so while I almost never need a plugin to syntax highlight
jinja
, I want one when I am modifying salt
settings. So here’s what I do:
Get some plugins:
mkdir ~/code/vim-salt-plugins
cd ~/code/vim-salt-plugins
git clone git://github.com/saltstack/salt-vim
git clone git://github.com/lepture/vim-jinja
Load them in the outer session:
call pathogen#infect('/home/frew/code/vim-salt-plugins/{}')
source /home/frew/.vvar/sessions/_salt
I’m not sure how well the above works with, say, Vundle
, but I imagine it
could be done. With this I now have plugins for specific, weird projects that I
don’t end up carrying around with my dotfiles all the time. I love it.
I’m really pleased with this pattern. I expect to use it for more things in the future. One idea that springs to mind is plugins that are only appropriate for one project; just commit the vim script directly and source it from the outer session. But for now this is already incredibly convenient for me; I hope it is for you too!
(The following includes affiliate links.)
If you’d like to learn more, I can recommend two excellent books. I first learned how to use vi from Learning the vi and Vim Editors. The new edition has a lot more information and spends more time on Vim specific features. It was helpful for me at the time, and the fundamental model of vi is still well supported in Vim and this book explores that well.
Second, if you really want to up your editing game, check out Practical Vim. It’s a very approachable book that unpacks some of the lesser used features in ways that will be clearly and immediately useful. I periodically review this book because it’s such a treasure trove of clear hints and tips.
Posted Fri, Feb 10, 2017If you're interested in being notified when new posts are published, you can subscribe here; you'll get an email once a week at the most.