Что случилось с ido-imenu в функции Ruby-mode в Emacs24?
Вопрос
Эмакс 23.2 в emacs-starter-kit v1 есть C-x C-i
(или ido-imenu
) (аналогично Cmd+R в Sublime Text). Эмакс24 в emacs-starter-kit v2 эта функция отсутствует.я нашел эта проблема с github и исправление, которые пытаются воссоздать функциональность.Хотя это ido-imenu
работает в elisp-mode
, он перестал работать в ruby-mode
.Я получил:
imenu--make-index-alist: No items suitable for an index found in this buffer
- Кто-нибудь понял, как заставить это работать?
- Почему это было удалено из Emacs24?
- Есть ли новая замена этой функции?
Решение 2
И вот я наконец понял это, прочитав Определение меню-меню для режима раздел снова на emacs-wiki.
Короткий ответ:вам нужно добавить этот бит в вашу настройку.Не стесняйтесь добавлять больше типы в список (меня устраивают только методы).
(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 главный конкурент Emacs Prelude предлагает ту же функциональность (привязана к <кБД> CC I по умолчанию), и, похоже, работает нормально с Ruby-Mode в Emacs 24. здесь Вы можете найти больше на ido-imenu
.