info-lookup-symbol について

emacs のコマンド(関数)に info-lookup-symbol というものがあり,大変便利なのですが,ひょっとしたらあまり知られてないかもと思ったので,記事に書くことにしました.

info-lookup-symbol は,バッファ中の関数名や用語などの定義や記述を info から探し出し,別のウィンドウにその該当の info のページを表示するというものです.普通は C-h S あるいは C-h C-i にキーが割り当てられていると思います.

たとえば,C のプログラムを編集しているときに,printf の引数の定義を知りたいといった場合,M-x info-lookup-symbol (あるいは C-h S 等)と入力すると,ミニバッファにプロンプトが表示されます.そこで printf などと入力すると,その該当する info ページが表示されます.C や emacs lisp のプログラムを読み書きしているときに,たいへん重宝します.

もちろん,必要な info ファイルがインストールされていなければなりません.GNU Libc の info や emacs lisp の info は,それぞれ http://www.gnu.org/software/libc/manual/http://www.gnu.org/software/emacs/manual/elisp.html から入手できます.

ちなみに,find-tag と info-lookup-symbol との違いは,前者は,etags によって生成された TAGS ファイルを用いることにより,そのシンボルが定義されているソースコードの場所を探すものだという点です.どちらも状況に合わせて適宜併用すればよいと思います.

なお,info-lookup-symbol の挙動ですが,emacs 21 と emacs 22 では微妙に異なるようです.emacs 21 では *info* ウィンドウのポイントはバッファの先頭に置かれますが,emacs 22 では,ちゃんとそのシンボルの場所が表示されます.


とまあ長々と書いてきたのですが,ここまでは一般論で,以下に私の設定について書いておきたいと思います.参考になることもあるかもしれませんので.

通常の info-lookup-symbol の使い方だと,「C-h S(または C-h C-i)」→「ミニバッファで調べたい関数名などを入力(補完も効きます)」という順になりますが,何度もこういう作業を繰り返すのはうっとうしい感じがしてきます.なので,私は,調べたい関数名や用語などをマウスでクリック(ドラッグする必要はなく,関数名の任意の位置をクリックするだけ)して,info-lookup-symbol が起動するような設定にしています.

具体的には,まず,以下のような関数を定義します.

(defun my-mouse-info-lookup-symbol (e)
  (interactive "e")
  (mouse-set-point e)
  (let ((bounds (bounds-of-thing-at-point 'symbol)))
    (info-lookup-symbol (buffer-substring-no-properties (car bounds) (cdr bounds)))))


この関数を,たとえば C mode を例にとると,以下のようにキーを割り当てます.my-mouse-info-lookup-symbol は,emacs lisp mode などでもまったく同じように使えます.

(add-hook 'c-mode-hook
          (lambda ()
            (define-key c-mode-map [mouse-2] 'my-mouse-info-lookup-symbol)))


mouse-2 は,普通は3ボタンマウスの真ん中のボタンを意味します.マウスの右ボタンにするためには,普通は mouse-3 と指定すればいいと思います.他にも,たとえば,「Shift + 真ん中のボタン」というキー操作を指定するためには,S-mouse-2 とすればいいでしょう.このように,キーは適当に変更してください.

以上のような設定で,マウスのクリックだけで,該当する用語を info ファイルから探せるようになったと思います.


最後にもう一つ.マイナーなライブラリや自作のライブラリなどの info ファイルを探せるような設定についてです.たとえば,私がよく使う GMP (The GNU MP Bignum Library) では,以下のようにすることで,info-lookup-symbol によって GMP の info を検索できるようになります.C や emacs lisp ではこのような設定は必要ありませんが,デフォルトで設定されていない場合は,以下のような設定を参考にするといいと思います.

(eval-after-load "info-look"
        '(let ((mode-value (assoc 'c-mode (assoc 'symbol info-lookup-alist))))
           (setcar (nthcdr 3 mode-value)
                   (cons '("(gmp)Function Index" nil "^ -.* " "\\>")
                         (nth 3 mode-value)))))