¿Qué pasó con el ido-imenu en la función modo ruby en Emacs24?
Pregunta
Emacs 23.2 en emacs-starter-kit v1 tiene C-x C-i
(o ido-imenu
) (similar a Cmd+R de Sublime Text). Emacs24 en emacs-starter-kit v2 carece de esta función.encontré este problema de github y un arreglo, que intentan recrear la funcionalidad.Mientras esto ido-imenu
trabaja en elisp-mode
, dejó de funcionar en ruby-mode
.Yo obtengo:
imenu--make-index-alist: No items suitable for an index found in this buffer
- ¿Alguien ha descubierto cómo hacer que esto funcione?
- ¿Por qué se eliminó esto de Emacs24?
- ¿Existe un nuevo reemplazo para esta función?
Solución 2
Así que finalmente lo descubrí, después de leer el Definición de un menú Imenu para un modo sección en emacs-wiki nuevamente.
Respuesta corta:necesitas agregar este bit a tu personalización.Siéntase libre de agregar más tipos a la lista (estoy contento con solo los métodos).
(add-hook 'ruby-mode-hook
(lambda ()
(set (make-local-variable imenu-generic-expression)
'(("Methods" "^\\( *\\(def\\) +.+\\)" 1)
))))
respuesta más larga:Primero intenté definir un ruby-imenu-generic-expression
función y configúrelo en imenu-generic-expression
usando el 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)
Sin embargo, esto no funcionó (obtendría el mismo error que antes).Más lectura del Definición de un menú Imenu para un modo sección me mostró el camino.Ahora, no soy un elisp
experto, así que aquí está mi hipótesis:Básicamente, el método anterior funciona para modos en los que el
El modo principal admite una copia local del búfer de la variable "real", "imenu-generic-expression".Si tu modo no lo hace, tendrás que confiar en un gancho.
el ejemplo para foo-mode
dejó claro cómo hacerlo para ruby-mode
.Entonces parece que ruby-mode
no tiene una copia local del buffer del real imenu-generic-expression
variable.Todavía no puedo explicar por qué funcionó en Emacs 23.2 (con ESK v1) pero no en Emacs24, pero bueno, al menos encontré una solución que funciona.
Otros consejos
Dado que la función es parte de ESK (en comparación con algo que se estrechó con Emacs), es probable que lo haga mejor para informar el error ascendente.En una nota relacionada, EMACS principales del competidor ESK, Preludio ofrece la misma funcionalidad (unida a CC I de forma predeterminada) y parece estar funcionando bien con el modo Ruby en Emacs 24. aquí puede encontrar más en ido-imenu
.