I am from the school of thought that recognizes the fact that typing is not the bottleneck for software engineering. So I am perfectly fine to use my command line, my vi and my Makefile. My peers consider me a weirdo for not using an IDE. Additionally, a powerful debugger is not a substitute for thought either, as expertly expressed by Rob Pike.
Not using an IDE means a more direct control over what happens. No schemas, no vcproj xml, no burried GUI fields, no property sheets. Or as I call it: bliss!
But fair enough, I spend a non trivial amount of time opening and closing vi, because I need to navigate my code. What could we do to reduce that?
Remember your place
First off, it helps if vim (I'll use vim and vi interchangably) remembers where you cursor was, last time you edited a file. For this, we have the following snippet in .vim/vimrc configuration file:
if has("autocmd") au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif endif
Toggle to/from header file
Next up: we want to be able to quickly toggle between header file and implementation file. Because I mix up C and C++, I unfortunately have three instead of two shortcuts for that. \oh to open the header, \oc to open the .c file, and \oC to open the .cpp file. You can have those too, with this in the configuration:
nnoremap oc :e %<.c nnoremap oC :e %<.cpp nnoremap oh :e %<.h :set timeoutlen=2000
Note: The time out is added, so that you have some time between pressing the leader key (backslash) and the command.
Jump to declaration
But how do I quickly jump to the declaration of a particular function? Well, there is a mechanism for that too, called include jump. The vim editor can parse your include statements, so that with the :ij foo command, you can open up the header that declares the foo() function. But you do need to point vim to the path of files to try, which I do with:
set path=.,**
Jump to another file, regardless of location
If you just want to jump to a named file, but don't want to be typing full paths, you can use the :find bar.cpp syntax.
So there we have it: less quiting and starting vim. For completeness, my entire .vim/vimrc configuration is below:
filetype plugin on set path=.,** if has("autocmd") au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif endif set wildignore=*.d,*.o nnoremap oc :e %<.c nnoremap oC :e %<.cpp nnoremap oh :e %<.h :set timeoutlen=2000 autocmd Filetype python setlocal noexpandtab tabstop=8 shiftwidth=8 softtabstop=8