Buffer-switching is one of those things I do all the time in Emacs. And it
should be quick and efficient, or it will break my 'flow'. There are many
ways to customize the buffer switching experience, and we already discussed
quite a few of those here: using Ctrl-Tab, iswitchb/ido, ibuffer, the lusty explorer and others.
Some of those packages - ido
and lusty-explorer
- do not solely focus on
buffer-switching - they also let you open files using the same user
interface. But why stop at files and buffers - wouldn't it be nice if we
could quickly find just about anything quickly?
Indeed that would be nice - and there's a way to do just that - using the
aptly named anything package. I was always a bit put off by this package due
to the screenshots (see link), but once I got over that, I've become a very
happy user.
Anyhow, what can anything
find? I mentioned buffers and files, but it can
also find bookmarks, recently used files, any file on your system (using
locate
), man-pages, info-pages, emacs-function/variables,
FIXME
-comments, org
-headlines, bbdb-contacts, google-suggests… and a
million other things. It can probably find your car keys, too.
Installation is pretty straightforward, using the git-repository:
git clone git://repo.or.cz/anything-config.git
Then, go into the just-cloned directory and execute make
. After that, add
to your .emacs
(or ~/.emacs.d/init.el
):
(add-to-list 'load-path "path-to-anything")
(require 'anything-config)
This will add a menu with various anything
-commands, and a bunch of
key-bindings, starting with F5. Play around a bit with it, it's nice. The
results are shown in a little temporary buffer, and pressing Tab
will let
you do (search-type dependent) actions on the matches - for example
ediff
two buffers.
Of course, the real fun starts when we super-charge some of the normal
emacs functions with anything-based ones. Let's look at buffer
switching. Let's create an anything
-based version, and assign it to C-x b
, the good-old switch-to-buffer
.
The thing to consider is that while anything can find just about
anything, you (well, I) usually only want to search for a certain set of
things; when I want to switch to another buffer, I don't want to match
man-pages. Luckily, anything
allows for making nifty function which use
certain subsets of the search sources. So for buffer switching, I have:
(global-set-key (kbd "C-x b")
(lambda() (interactive)
(anything
:prompt "Switch to: "
:candidate-number-limit 10
:sources
'( anything-c-source-buffers
anything-c-source-recentf
anything-c-source-bookmarks
anything-c-source-files-in-current-dir+
anything-c-source-locate))))
This will search in buffers, then in my recent-files, then in my bookmarks,
the files in the current directory, and finally check with the locate
tool. That last one is pretty neat, and finally gives me something back for
the countless times I've wondered why the hard disk is grinding – indeed,
it was locate
, updating its database.
Then, I've defined another binding for searching general documentation on
my system; I've put it under C-c I
. This looks look something like the
following:
(global-set-key (kbd "C-c I")
(lambda () (interactive)
(anything
:prompt "Info about: "
:candidate-number-limit 3
:sources
'( anything-c-source-info-libc
anything-c-source-man-pages
anything-c-source-info-emacs))))
These are sources I query quite regularly; there are many more to be
found - for most packages with info-pages there's a corresponding
anything-c-source-info-...
; there's a list in anything-config.el.
Now, those are my general documentation sources; in specific modes, I
have specialized information sources; for example, for elisp-mode
:
(add-hook 'emacs-lisp-mode-hook
(lambda()
(local-set-key (kbd "C-c i")
(lambda() (interactive)
(anything
:prompt "Info about: "
:candidate-number-limit 5
:sources
'( anything-c-source-emacs-functions
anything-c-source-emacs-variables
anything-c-source-info-elisp
anything-c-source-emacs-commands
anything-c-source-emacs-source-defun
anything-c-source-emacs-lisp-expectations
anything-c-source-emacs-lisp-toplevels
anything-c-source-emacs-functions-with-abbrevs
anything-c-source-info-emacs))))
This post just scratches the surface of what is possible – so go and
experiment :) One interesting thing is to add your own sources; I played a
bit with that already,
There are many things in anything
I did not cover yet. First, there are
many more sources to search - and it's pretty easy to write your own – see
the EmacsWiki-page.