2011-02-09

プロパティリストを調べる describe-plist

Emacs をもう少し詳しく理解するための関数。
Elispの基本的なことですが、シンボルは4つの値を持つことができます。

・名前
・変数
・関数
・プロパティリスト

詳しくは info を参照。
M-: (info "(elisp)Symbol Components")
変数は M-x describe-variable (C-h v) 、関数は M-x describe-function (C-h f) で調べることができますが、最後のプロパティリストについては便利なコマンドは用意されていません。
そこで、 apropos.el に apropos-describe-plist という関数があるので、それを呼び出すコマンドを作ります。

(defun describe-plist (symbol)
  "Display SYMBOL's property list."
  (interactive
   (let ((sym (variable-at-point t))
         (enable-recursive-minibuffers t)
         str)
     (when (or (not (symbolp sym))
               (not (symbol-plist sym)))
       (setq sym nil))
     (setq str (completing-read
                (if sym
                    (format
                     "Describe property list (default %s): " sym)
                  "Describe property list: ")
                obarray
                'symbol-plist
                t nil nil
                (when sym (symbol-name sym))))
     (list (if (equal str "")
               sym (intern str)))))
  (unless (symbol-plist symbol)
    (error "Symbol %s has no property list" symbol))
  (require 'apropos)
  (apropos-describe-plist symbol))

(define-key help-map "P" 'describe-plist)

キーバインドは一例です。上の例だと C-h P に割り当てています。
挙動は M-x describe-variable 等と同様に、シンボルがプロパティリストを持たない場合はミニバッファでの補完はききません。

試しに M-x describe-plist RET mark-inactive RET とすると、このように表示されます。

Symbol mark-inactive's plist is
 (error-conditions (mark-inactive error)
  error-message "The mark is not active now")

[back]

動作確認は GNU Emacs 22 でしています。