Just to add tweaks that I use with already mentioned [Ido](http://www.emacswiki.org/emacs/InteractivelyDoThings):

    (use-package ido)
    (use-package ido-hacks)
    (use-package flx-ido)
    (use-package ido-vertical-mode)

    (ido-mode 1)
    (flx-ido-mode 1)
    (ido-hacks-mode 1)
    (ido-everywhere 1)
    (ido-vertical-mode 1)

    (setq ido-enable-flex-matching t
          ido-use-filename-at-point 'guess
          ido-vertical-define-keys 'C-n-C-p-up-down-left-right))

I'm also using `ace-window` to switch between buffers together with `ace-jump-mode` to *jump* between visible windows. Comes with some getting used to but worth trying.

I have combined it with `key-chord-mode` and hit `so` for quick jump:

    (key-chord-define-global "so" 'ace-window)