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 -
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,
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
;; path-to-anything is the path which has the 'anything' we just cloned (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
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
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 ;; up to 10 of each :sources '( anything-c-source-buffers ;; buffers anything-c-source-recentf ;; recent files anything-c-source-bookmarks ;; bookmarks anything-c-source-files-in-current-dir+ ;; current dir anything-c-source-locate)))) ;; use '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
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,
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
(global-set-key (kbd "C-c I") ;; i -> info (lambda () (interactive) (anything :prompt "Info about: " :candidate-number-limit 3 :sources '( anything-c-source-info-libc ;; glibc docs anything-c-source-man-pages ;; man pages anything-c-source-info-emacs)))) ;; 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
(add-hook 'emacs-lisp-mode-hook (lambda() ;; other stuff... ;; ... ;; put useful info under C-c i (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