Emacs 23.2有C-x C-i
(或ido-imenu
)(类似于Sublime Text的Cmd + R)。 emacs-starter-kit v2中的Emacs24缺少此功能。我找到了this github issue和a fix,它们尝试重新创建功能。虽然此ido-imenu
适用于elisp-mode
,但它已停止在ruby-mode
中工作。我明白了:
imenu--make-index-alist: No items suitable for an index found in this buffer
答案 0 :(得分:4)
由于该函数是ESK的一部分(与使用Emacs发布的内容相反),您可能最好报告上游的错误。在相关的说明中,ESK的主要竞争对手Emacs Prelude提供了相同的功能(默认情况下绑定到 Cc i ),它似乎在Emacs 24中使用ruby-mode工作正常。Here你可以在ido-imenu
上找到更多信息。
答案 1 :(得分:2)
所以我在读完emacs-wiki上的Defining an Imenu Menu for a Mode section之后终于明白了。
简短回答:您需要将此位添加到自定义中。随意在列表中添加更多类型(我对方法感到满意)。
(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)
然而这不起作用(我会得到与以前相同的错误)。更多阅读Defining an Imenu Menu for a Mode section向我展示了道路。现在,我不是elisp
专家,所以这里是我的假设:基本上,上述方法适用于
主模式支持“真实”变量“imenu-generic-expression”的缓冲区本地副本。如果你的模式没有这样做,你将不得不依赖一个钩子。
foo-mode
的示例明确了如何为ruby-mode
执行此操作。因此,ruby-mode
似乎没有真实imenu-generic-expression
变量的缓冲区本地副本。我仍然无法解释为什么它在Emacs 23.2(使用ESK v1)中有效但在Emacs24上没有,但至少我发现了一个可行的解决方案。