そこで、emacs-wikiの「モード用の Imenu メニューの定義」セクションをもう一度読んだ後、ようやくそれを理解しました。
簡単な答え: このビットをカスタマイズに追加する必要があります。リストに型を自由に追加してください (メソッドだけで十分です)。
(add-hook 'ruby-mode-hook
(lambda ()
(set (make-local-variable imenu-generic-expression)
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1)
))))
より長い答えruby-imenu-generic-expression
:私は最初に関数を定義しようとし、次imenu-generic-expression
を使用してそれを設定しようとしましたruby-mode-hook
:
(defvar ruby-imenu-generic-expression
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1))
"The imenu regex to parse an outline of the ruby file")
(defun ruby-set-imenu-generic-expression ()
(make-local-variable 'imenu-generic-expression)
(make-local-variable 'imenu-create-index-function)
(setq imenu-create-index-function 'imenu-default-create-index-function)
(setq imenu-generic-expression ruby-imenu-generic-expression))
(add-hook 'ruby-mode-hook 'ruby-set-imenu-generic-expression)
ただし、これは機能しませんでした (以前と同じエラーが発生します)。モードセクションの Imenu メニューの定義をさらに読むと、その方法がわかりました。さて、私はelisp
専門家ではないので、ここに私の仮説があります: 基本的に、上記の方法は、
メジャー モードは、「実際の」変数 'imenu-generic-expression' のバッファー ローカル コピーをサポートします。モードでそれができない場合は、フックに頼る必要があります。
の例は、foo-mode
に対してそれを行う方法を明確にしましたruby-mode
。そのため、実際の変数ruby-mode
のバッファー ローカル コピーがないように見えます。imenu-generic-expression
Emacs 23.2 (ESK v1 を使用) では機能するのに Emacs24 では機能しない理由をまだ説明できませんが、少なくとも機能する解決策を見つけました。