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.