How I learned to stop worrying and love Vim buffers
Background
Over the past six years I have used Vim with increasing exclusivity. I
have read a couple books (User
Manual, Learning
Vi) on Vim from cover-to-cover.
But I have always tried to use Vim as though it was a modern, tabbed
editor, even before it had
tabs. Once Vim 7 was
released with support for actual tabs, I ecstatically dove right in. I
aliased vim
to vim -p
and created my own MyTabLine function
displaying the tab number to make it easier to jump from tab-to-tab, for
example, 8gt
to jump to the eighth tab. But many tabs get unwieldy and
Vim quickly runs out of screen space to display them all. It became
apparent that I (and others, upon a cursory glance at the mailing list)
was trying to force a certain, modern, usage pattern on tabs that did
not fit the Vim editing pattern well.
In Vim, a buffer is a file that you have open in the editor (even if it’s not currently displayed), and a window is a view of a buffer. Well tabs in Vim 7 are really just views for windows. There isn’t a mechanism in Vim to tie a certain buffer to a certain tab ((1)(#footnotes)) which would fit better with the modern idea of tabs. This was finally impressed on me while watching Bram Moolenaar describe tabs: he doesn’t use them! They are really intended to group Vim windows without having to resort to multiple xterms or GNU Screen windows.
How the old guys use Vim
There’s a third opinion in the perpetual Emacs vs. Vim holy war written by one of those grumpy, uphill-both-ways, old guys. In an excellent writeup of his favored text editor he mentioned something that got me thinking: “Ed is for those who can remember what they are working on.” Certainly this is an exaggeration, but one that is rooted in the very real tendency of young people to succumb to the siren call of ADHD. (Not necessarily the actual disorder, but maybe just a faster-paced reality?) I realize that I lazily relied on the visible list of files that were currently open to know which files I was working on—even when I knew which files I was working on if I would just give it some thought.
So here are some tips on how to effectively use buffers in Vim, please drop more in the comments If you have 'em. Also, never stop reading the built-in Vim documentation and online tips. Re-read a book on Vim every third year or so. Editors as old as this one have so many features you’ll never master them all, the more you keep trying the more efficient you’ll get at text-wrangling—and if you edit for a living, it’ll be well worth the time.
Vim Usage Tips for Young People
Start with the excellent Vim buffer FAQ! And search other Vim tips for ‘buffer’ for a lot of additional ideas.
Switch to a specific (N) buffer: :bN
or N
CTRL-^
. Or switch to a
buffer by (partial)-name: :b
filena<CR>
for a file named
filename.php, for example. I’m using a variant of tip
821 to quickly jump between
buffers by pressing <F2>
followed by a buffer number or name fragment:
map <F2> :ls<CR>:b<Space>
Use :bd
or :bw
to get rid of buffers you no longer need.
Configure :set path
to useful locations for your type of editing and
use :find
filename
a lot. In fact, you can start Vim from the shell
to edit a certain file somewhere on your Vim path like this:
$ vim "+find filename"
.
Use the alternate buffer to quickly jump between two files: CTRL-^
(or
CTRL-6
if you’re lucky) also you can do :b#
. My custom
statusline
displays the alternate buffer filename to remind me.
To open a bunch of additional files after you’ve already opened Vim use
:args
filename*
or :argadd files*.py
. Try using Vim’s :Explore
browser or just :cd
and :cd -
around the filesystem to get closer to
the files you need to add.
Map a key to :ls
or :args
for quick reference when you need to see
all the buffers you’ve got open. (Mine is F1 map
<F1>
:ls<cr>
.)
Footnotes
#1 The plugin minibufexplorer actually does a very good job of mapping one (virtual) tab to one buffer–which may explain why it’s the second-highest rated script on vim.org. I highly recommend using it as a sort of “training wheels” for eventually using buffers without a visual aid, as it allows you to see all available buffers as you edit.
-
1 ↩︎