auto-complete.elでpersistent-action(Emacs Lispシンボルに対してドキュメントを出す)

だいぶ前に実装したやつだけど、安定してきたので。anything.elのpersistent-actionを実装してみた。Emacs Lispのシンボルを補完しているときにC-zを押すと説明が出てくるよ。

(defvar ac-default-persistent-action nil)
(defun ac-execute-persistent-action ()
  "persistent-action."
  (interactive)
  (let* ((string (overlay-get (ac-menu-line-overlay ac-menu ac-selection) 'real-string))
         (source (get-text-property 0 'source string))
         (persistent-action-function
          (or (and source (cdr-safe (assq 'persistent-action source)))
              ac-default-persistent-action)))
    (if persistent-action-function
        (funcall persistent-action-function string))))

(setq ac-source-symbols
  '((candidates
     . (lambda ()
         (all-completions ac-target obarray)))
    (persistent-action . ac-describe-function-or-variable)))
(defun ac-describe-function-or-variable (cand)
  (let ((sym (intern-soft cand)))
    (cond ((p (fboundp sym))
           (describe-function sym))
          ((boundp sym)
           (describe-variable sym)))))

(define-key ac-complete-mode-map "\C-z" 'ac-execute-persistent-action)