Emacs24 中 ruby-mode 函数中的 ido-imenu 发生了什么?
题
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
- 有谁知道如何让它发挥作用吗?
- 为什么这个从 Emacs24 中被删除?
- 这个功能有新的替代品吗?
解决方案 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
.