2010/01/21

Emacs の speedbar に関して

Emacs の speedbar に関して、拡張子の登録とか関数一覧 (アウトライン?) とか。

speedbar に拡張子を登録

speedbar には全てのファイルが表示されていない。
例えば、拡張子 as ファイルはデフォルトで speedbar に表示されないので登録する。
以下では JavaScript と ActionScript, html, css, php を追加した。

(add-hook 'speedbar-mode-hook
          '(lambda ()
             (speedbar-add-supported-extension '("js" "as" "html" "css" "php"))))

speedbar で関数一覧

Emacs の speedbar で関数一覧 (アウトライン?) を作るには、etag というものを使う場合と、imenu というものを使う場合があるっぽく、手持ちの Carbon Emacs に入っていた speedbar では imenu だった。

imenu に関しては以下のサイトに詳しく説明してあった。
imenu.el の使い方と応用

このサイトを参考に ActionScript の関数一覧を作成した。

(defun as-imenu-create-index ()
  (let (index)
    (goto-char (point-min))
    (while (re-search-forward "^[ \t]*\\(public function\\|private function\\)\s+\\(\\w+\\)" (point-max) t)
      (push (cons (match-string 2) (match-beginning 1)) index))
    (nreverse index)))

(add-hook 'actionscript-mode-hook
          '(lambda ()
             (setq imenu-create-index-function 'as-imenu-create-index)))

これで speedbar を起動してみると関数一覧が出来る。

この imenu は任意に登録出来るので便利だと思った。
例えば、html モードで id 属性と class 属性を speedbar で一覧してみたのが以下。

(defun html-imenu-create-index ()
  (let ((index))
    (goto-char (point-min))
    (while (re-search-forward "\\(id\\|class\\)=\"\\([^\"]+\\)\"" nil t)
      (push (cons (concat
                   (if (equal "id" (match-string 1)) "#" ".")
                   (match-string 2)) (match-beginning 1)) index))
    (nreverse index)))

(add-hook 'html-mode-hook
          '(lambda ()
             (setq imenu-create-index-function 'html-imenu-create-index)))

この imenu はいろんなメジャーモードでも使われているっぽく、js2-mode や php-mode などでも関数一覧が作れるので、特に設定しなくても speedbar に関数一覧が表示されて便利。