在Emacs24中,ruby-mode函数中的ido-imenu发生了什么?

时间:2012-10-03 06:39:20

标签: emacs emacs24 ido ruby-mode

emacs-starter-kit v1中的

Emacs 23.2C-x C-i(或ido-imenu)(类似于Sublime Text的Cmd + R)。 emacs-starter-kit v2中的Emacs24缺少此功能。我找到了this github issuea fix,它们尝试重新创建功能。虽然此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 个答案:

答案 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上没有,但至少我发现了一个可行的解决方案。