Emacs 23.2 在 emacs-starter-kit v1 中有 C-x C-i (或者 ido-imenu)(类似于 Sublime Text 的 Cmd+R)。 Emacs24 在 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

所以在读完这篇文章后我终于明白了 为模式定义 Imenu 菜单 部分 再次在 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)

然而这不起作用(我会得到与以前相同的错误)。更多阅读 为模式定义 Imenu 菜单 部分 给我指明了道路。现在,我不是一个 elisp 专家,所以这是我的假设:基本上,上述方法适用于以下模式:

主要模式支持“真实”变量“imenu-generic-expression”的缓冲区本地副本。如果你的模式不能做到这一点,你将不得不依赖一个钩子。

示例为 foo-mode 明确了如何做 ruby-mode. 。所以看来 ruby-mode 没有真实的缓冲区本地副本 imenu-generic-expression 多变的。我仍然无法解释为什么它在 Emacs 23.2(使用 ESK v1)中有效,但在 Emacs24 上无效,但至少我找到了一个可行的解决方案。

其他提示

由于该函数是 ESK 的一部分(而不是与 Emacs 捆绑在一起的东西),您可能最好向上游报告错误。相关说明 ESK 主要竞争对手 Emacs Prelude 提供相同的功能(必然 C-c i 默认情况下)并且它似乎在 Emacs 24 中的 ruby​​ 模式下工作得很好。 这里 你可以找到更多关于 ido-imenu.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top