Emacs: help me understand file/buffer management
Solution 1:
-
Bind
C-x C-b
toibuffer
. This is a better buffer listing facility with many advanced features, and its default behaviour is to replace the current buffer with the buffer listing, and then bury the listing when you select a buffer (leaving you with the newly-selected buffer in place of the original one).You can simply use
C-x b
to enter your selection in the mini-buffer, of course; however the tab-completion (which is needed to make this a viable option, IMO) does open a new window temporarily, at which point I think you might as well familiarise yourself with something with more features. Use
a
instead ofRET
when selecting from dired. This kills the dired buffer instead of leaving it behind.C-h m
in any buffer will show you the help for its major mode (followed by help for the minor modes), and you can read about all the available dired key bindings there.http://www.emacswiki.org/cgi-bin/wiki/TabBarMode ? (edit: I prefer Rémi's answer for this one, but TabBarMode would give you the visual tab element if you were particularly keen on that.)
q
is bound to a 'quit' function in a great many major modes. Generally it buries the buffer rather than killing it, but I certainly find that fine.
To elaborate a little on #1, ibuffer has lots of nice features, and M-x customize-group ibuffer RET
will give you some idea of how you can customise it to your liking.
Furthermore, you can filter the buffer list by many criteria (again, use C-h m
to see its help page), and then generate a 'group' definition from the current filters, and save your custom filters and groups for future usage.
For example:
-
/ f ^/var/www/ RET
: filter buffer list to show only filenames starting with/var/www/
. -
/ s Web filters RET
: name and save active filter set to your init file. -
/ g Web development RET
: create a named group from the active filters. -
/ S My groups RET
: name and save group definitions to your init file. -
/ r Web filters RET
: invoke the "Web filters" filters. -
/ R My groups RET
: invoke the "My groups" groups. -
RET
on a group name to collapse or expand it. -
C-k
andC-y
to kill and yank groups, to re-arrange them. -
C-h m
for more information...
This way you can have a single Emacs instance running, and create filters and groups for different types of task, and easily switch between them.
Solution 2:
I think you will really enjoy Ido for dealing with multiple buffers who's names you can't exactly remember. When you type C-x b
it shows a list of open buffers in most used order. As you type some of the characters in a buffer name the list is filtered. The characters you type don't have to be at the begging of the name or contiguous. Using C-f
, C-b
or left/right arrow keys cycles through the buffer choices.
Also see Smex for Ido like functionality for M-x
Closing windows is done with C-x 0
. Intentionally splitting the window is done with C-x 2
for horizontal, C-x 3
for vertical. I love this feature, since it allows me to have test and production code visible at the same time. C-x o
takes me to the other window.
Solution 3:
I use C-x right
(or C-x C-right
) and C-x left
(or C-x C-right
) to go to the next and previous buffer. I don't mind anymore off the few buffer that lay around in Emacs but you could use k
in the buffer list to kill the buffer you don't use anymore.
Solution 4:
You can also try Iswitchb mode which provides auto-completion for buffer names when you switch buffers via C-x b
.
To activate:
M-x iswitchb-mode
Or add to your .emacs file:
(iswitchb-mode)
It is similar to Ido mode for buffer switching but a bit more lightweight.
Also, if you want a more customizable listing of your buffers then use M-x bs-show
as an alternative to C-x C-b
. In that buffer type ?
to get a list of actions you can perform.
Solution 5:
I think the number one most useful extension for flipping through buffers is Anything. It lets you start typing part of a buffer (or file!) name and it will figure out what you want. I've rebound C-x b to anything-for-buffers. It makes life so much better.