Was ist mit der Funktion ido-imenu im Ruby-Modus in Emacs24 passiert?
Frage
Emacs 23.2 im emacs-Starter-Kit v1 hat C-x C-i
(oder ido-imenu
) (ähnlich wie Cmd + R von Sublime Text). Emacs24 im emacs-Starter-kit v2 fehlt diese Funktion.Ich fand dieses Github-Problem und eine Lösung, die versuchen, die Funktionalität wiederherzustellen.Während dies ido-imenu
arbeitet in elisp-mode
, es hat aufgehört zu arbeiten ruby-mode
.Ich bekomme:
imenu--make-index-alist: No items suitable for an index found in this buffer
- Hat jemand herausgefunden, wie man das zum Laufen bringt?
- Warum wurde dies aus Emacs24 entfernt?
- Gibt es einen neuen Ersatz für diese Funktion?
Lösung 2
Also habe ich es endlich herausgefunden, nachdem ich das gelesen habe Definieren eines Imenu-Menüs für einen Modus Abschnitt wieder im Emacs-Wiki.
Kurze Antwort:sie müssen dieses Bit zu Ihrer Anpassung hinzufügen.Fühlen Sie sich frei, mehr hinzuzufügen Zimmertypen zur Liste (ich bin nur mit Methoden zufrieden).
(add-hook 'ruby-mode-hook
(lambda ()
(set (make-local-variable imenu-generic-expression)
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1)
))))
Längere Antwort:Ich habe zuerst versucht, a zu definieren ruby-imenu-generic-expression
funktion und setze das auf imenu-generic-expression
durch die Verwendung der 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)
Dies hat jedoch nicht funktioniert (ich würde den gleichen Fehler wie zuvor erhalten).Mehr Lesen von der Definieren eines Imenu-Menüs für einen Modus Abschnitt zeigte mir den Weg.Nun, ich bin kein elisp
experte, also hier ist meine Hypothese:grundsätzlich funktioniert die obige Methode für Modi, bei denen die
der Hauptmodus unterstützt eine lokale Pufferkopie der "echten" Variablen 'imenu-generic-expression'.Wenn Ihr Modus dies nicht tut, müssen Sie sich auf einen Haken verlassen.
Das Beispiel für foo-mode
machte deutlich, wie es geht für ruby-mode
.Es scheint also, dass ruby-mode
hat keine pufferlokale Kopie des realen imenu-generic-expression
variabel.Ich kann immer noch nicht erklären, warum es in Emacs 23.2 (mit ESK v1) funktioniert hat, aber nicht auf Emacs24, aber hey, zumindest habe ich eine funktionierende Lösung gefunden.
Andere Tipps
Da die Funktion Teil von ESK ist (im Gegensatz zu etwas, das mit Emacs zu tun hat), sollten Sie den Fehler wahrscheinlich am besten Upstream melden.In einem ähnlichen Zusammenhang bietet der ESK-Hauptkonkurrent Emacs Prelude die gleiche Funktionalität (gebunden an K-k i standardmäßig) und es scheint mit dem Ruby-Modus in Emacs 24 gut zu funktionieren. Hier mehr dazu finden Sie auf ido-imenu
.