1

emacs-starter-kit v1 中的Emacs 23.2C-x C-i(或ido-imenu)(类似于 Sublime Text 的 Cmd+R)。emacs-starter-kit v2 中的Emacs24缺少此功能。我发现了这个 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. 这个功能有新的替代品吗?
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-expression变量的缓冲区本地副本。我仍然无法解释为什么它在 Emacs 23.2(使用 ESK v1)中有效,但在 Emacs24 上无效,但至少我找到了一个有效的解决方案。

于 2012-10-05T08:48:58.510 回答