EMACS24のruby-mode関数のIDO-IMENUには何が起こったのですか?
質問
EMACS 23.2 emacs-starter-kit v1にはC-x C-i
(またはido-imenu
)があります。(サブライトテキストのCMD + Rと同様)。 EMACS-Starter-Kit V2では、この機能がありません。このgithub issue と機能を再現しようとします。このido-imenu
はelisp-mode
で機能しますが、ruby-mode
で動作しなくなりました。私は得られます:
imenu--make-index-alist: No items suitable for an index found in this buffer
.
解決 2
だから私はついにそれを読みた後、 モードのためのimenuメニューの定義を述べた。 emacs-wikiのstrong>セクション。
短時間:あなたのカスタマイズにこのビットを追加する必要があります。リストに型を追加してください(私はメソッドだけで満足しています)。
(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)
.
これは機能しませんでした(以前と同じエラーが発生します)。 モードのイメンメニューの定義セクション道。さて、私はelisp
エキスパートではありませんので、ここで私の仮説:基本的に、上記の方法は
メジャーモードは、「実際の」変数 'imenu-generic-expression'のバッファローカルコピーをサポートしています。あなたのモードがそれをしないならば、あなたはフックに頼る必要があります。
foo-mode
の例では、ruby-mode
のためにそれを実行する方法を明確にしました。したがって、ruby-mode
には、実際のimenu-generic-expression
変数のバッファローカルコピーがありません。私はまだemacs 23.2(ESK V1を持つ)で働いていたがEMACS24で働いていない理由を説明することはできませんが、少なくとも私は作業ソリューションを見つけました。
他のヒント
この機能はESKの一部であるため(Emacsで予定されているものとは対照的に)あなたはおそらく上流にバグを報告するために最善を尽くします。関連するノートESKのMain Completitor Emacs Preludeは、同じ機能(デフォルトで CC i にバインドされています)を提供し、EMACS 24ではRuby-Modeでうまく機能しているようです。ここ ido-imenu
についてもっと見つけることができます。