1

emacs-starter-kit v1 のEmacs 23.2C-x C-iには(またはido-imenu) があります (Sublime Text の Cmd+R に似ています)。emacs-starter-kit v2 のEmacs24にはこの機能がありません。機能を再現しようとするこの github issuefixを見つけました。これは ではido-imenu機能しますがelisp-mode、 では機能しなくなりましたruby-mode。私は得る:

imenu--make-index-alist: No items suitable for an index found in this buffer
  1. 誰もこれを機能させる方法を考え出しましたか?
  2. なぜこれは Emacs24 から取り除かれたのですか?
  3. この機能の新しい代替品はありますか?
4

2 に答える 2

4

関数は ESK の一部であるため (Emacs に付随するものとは対照的に)、バグを上流に報告するのが最善でしょう。関連して、ESK の主な競合相手である Emacs Prelude は同じ機能を提供し (デフォルトでバインドされていますC-c i)、Emacs 24 の ruby​​-mode で問題なく動作しているようです。ido-imenu

于 2012-10-03T09:55:48.133 に答える
2

そこで、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-expressionEmacs 23.2 (ESK v1 を使用) では機能するのに Emacs24 では機能しない理由をまだ説明できませんが、少なくとも機能する解決策を見つけました。

于 2012-10-05T08:48:58.510 に答える