2011-02-11

Emacs Lisp モードで M-x find-* を使う

Emacs Lisp モードでシンボルが定義されているソースファイルを直接開くコマンドは以下の4つがあります。

M-x find-library
M-x find-variable
M-x find-face-definition
M-x find-function


M-x find-* とタイプするのは面倒だし、キーバインドを4つも定義したくない。
そこで、カーソル位置のシンボルから自動で上の4つを選択してくれたら、というのがここで紹介する方法。

変数、関数、フェイス等、複数の値を持つシンボルに関しては変数を優先するようになってます。
シンボルが値を持たない場合、 M-x find-tag を実行するので、下の例では M-. に割り当てています。

(defun my-find-tag ()
  "In Emacs Lisp mode, one of these functions is called:
`find-library', `find-variable', `find-face-definition',
`find-function' and `find-tag'."
  (interactive)
  (call-interactively
   (let ((symbol (variable-at-point t))
         (variable (variable-at-point))
         (function (function-called-at-point)))
     (cond
      ((or (eq function 'require)
           (eq function 'featurep))
       'find-library)
      ((and (symbolp variable)
            (boundp variable))
       'find-variable)
      ((and (symbolp symbol)
            (facep symbol))
       'find-face-definition)
      ((and (fboundp function)
            (eq symbol function))
       'find-function)
      (t
       'find-tag)))))

(eval-after-load "lisp-mode"
  '(define-key lisp-mode-shared-map "\M-." 'my-find-tag)) ; find-tag