At the official end of my Python IDE series, I said I’d do a writeup on my Vim setup, to show what I like, and what I expect my text editor to do in helping me to both navigate and write code without getting in the way. It’s taken a long time to get around to, but here it is. ** * **
Ctrl-P
Ctrl-P is very much the Vim-counterpart of Ctrl-P in Sublime Text 2. You use it for finding files in a project. It supports fuzzy matching, regexes, and lots of other cool things. I find navigating my filesystem really boring and tedious, and Ctrl-P helps with that a lot. I’ve also got Ctrl-J mapped to buffer-mode, so I can search for buffers by name quickly.
Previously I used Buffergator/Minibuf Explorer for buffer management, but they were cumbersome and conflicted with the way I like to do things. On top of that, Ctrl-P gave me everything I needed, and I figured one less plugin is a good thing.
TL;DR: Navigating files within a repository, and open buffers.
Syntastic
Syntastic is the be-all, end-all of syntax checker plugins in Vim. It supports tonnes of different languages, and different tools for each language, too. Due to my Python background, prior to Syntastic I used pyflakes and nothing else. I really don’t recommend going down that path. Syntastic is the future!
TL;DR: Provides error checking tools for a lot of languages with minimal fuss.
iwilldiffer
iwilldiffer uses the sign column on the left of the line numbers to highlight changes lines since the previous commit. I like it because it’s written in Python, so I can modify it. There are a few alternatives out there, but the documentation isn’t great for all of them, or they only support a single VCS. iwilldiffer supports mercurial, git and bazaar.
TL;DR: Showing pending changes to a file without having to run the diff tool manually.
Easymotion
If you use the f
, F
, t
or T
commands, you know how useful it is for
jumping to the next, second, or even fifth occurence of a character. But what
about the 79th? What if you’re staring at the word you want to jump to, and
searching to get there is is too much effort? vim-easymotions is really good
for that. The default config of <leader><leader><command>
will label all
matches, so you only have to type in that label to reach it. Really nice for
jumping around quickly.
TL;DR: Nicer tools for f
and t
commands when jumping to extreme
distances.
Powerline
A decent status line. Not much more to say on it - it’s coloured for various states you’re in, shows encoding, syntax and filetype. I went with the old one that is no longer maintained, because unicode symbols actually work, and it doesn’t add 500ms of startup time to Vim.
TL;DR: Tersely shows useful metadata about the state of the current file and Vim.
Surround
If you’ve ever been in any of the following scenarios;
- You want delete all text inside a matching of parentheses, i.e.
self.foo(a, b,c)
->self.foo()
- You want to replace all content inside some square brackets, i.e.
foo['abc']
->foo[1]
- You want to remove the surrounding parentheses, i.e.
self.foo()
->self.foo
Then this is the plugin you’re looking for. The default bindings are very
idiomatic, with the above commands provided by di(
, ci[
and ds(
. There
are other bindings as well, like “surround this word”, but I find them less
useful.
All cards on the table, it’s a little buggy sometimes, especially with deletions and adding surroundings where previously there were none. But it’s better than the alternatives.
TL;DR: Management of parentheses and quotes.
Multiple Cursors
If you’ve ever used Sublime Text 2, you know about multiple cursors. Basically you select multiple points, and start typing. Whatever you type will appear in each of the selected points. This is really useful for doing things like grouping a bunch of lines with quotation marks. Sure, you could just use search and replace or macros, but this is really nice because it’s visual. It’s quite buggy around the undo behaviour, though. But I can live with that.
TL;DR: Visualised macros.
Ultisnips
If you’ve ever use TextMate, you’ll know what I’m about to talk about. Tab
completion for snippets of code, which is what Ultisnips is for. For the
longest time I used SnipMate, and I
really enjoyed it. Upon the recommendation that I try Ultisnips, and the
revelation that SnipMate is no longer maintained, Ultisnips has a very large
collections of builtin snippets, particularly so for python. They’re intuitive,
as well. For example an in Python, you can type context
, then press tab, and
you’ll get the method signations for implementing a context manager.
TL;DR: Snippets with lots of sane builtins.
Pathogen
Finally, you’re nuts if you don’t use something like Pathogen. It’s a Vim plugin for managing other plugins - you basically keep all plugins separate, so you can add, remove or update a plugin really easily.
** *: ** I found it very hard to finish this article. I frequently see a lot of blog posts about “using Vim as an IDE” and this really put me off, because that’s not really the point of what I’ve written above. I firmly believe that Vim is not and IDE, and shouldn’t be treated like one.
TL;DR: You better be using Pathogen.