Depuis que certaines personnes l'ont demandé, j'ai transformé cette réponse
 en un package .
Si vous avez configuré Melpa, vous pouvez l'installer avec 
M-x package-install RET aggressive-indent
Consultez le fichier Lisez - moi pour toutes les options, mais le moyen le plus simple de l'activer est:
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
L'ancienne réponse
Ce qui suit effectue l'indentation automatique uniquement sur les tampons elisp. Il a l'avantage de fonctionner également lorsque vous effacez ou tirez des trucs (au lieu de simplement taper). Il est également facile d'ajouter à d'autres modes.
Cette fonction indentera toute expression s dans laquelle le point se trouve actuellement. Vous pouvez le lier à une clé si vous le souhaitez, mais voyez d'abord ci-dessous.
(require 'cl-lib)
(defun endless/indent-defun ()
  "Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
  (interactive)
  (ignore-errors
    (unless (or (region-active-p)
                buffer-read-only
                (null (buffer-modified-p)))
      (let ((l (save-excursion (beginning-of-defun 1) (point)))
            (r (save-excursion (end-of-defun 1) (point))))
        (cl-letf (((symbol-function 'message) #'ignore))
          (indent-region l r))))))
Ce crochet fera en sorte que cette fonction sera exécutée après avoir tapé quoi que ce soit, mais uniquement dans les tampons elisp. Cela devrait garder tout toujours en retrait.
(add-hook
 'emacs-lisp-mode-hook
 (lambda ()
   (add-hook 'post-command-hook
             #'endless/indent-defun nil 'local)))
Essayez! Cela fonctionne remarquablement bien.
En outre, en suivant la suggestion de @ holocronweaver dans les commentaires, vous pouvez utiliser quelque chose comme ce qui suit pour les langages de type c:
(define-key c++-mode-map ";"
  (lambda () (interactive)
    (insert ";")
    (endless/indent-defun)))