Вопрос

Эмакс 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
  1. Кто-нибудь понял, как заставить это работать?
  2. Почему это было удалено из Emacs24?
  3. Есть ли новая замена этой функции?
Это было полезно?

Решение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top