因此,在再次阅读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 上无效,但至少我找到了一个有效的解决方案。