Emacs24中ruby模式下的ido imenu函数发生了什么变化?

Emacs24中ruby模式下的ido imenu函数发生了什么变化?,emacs,emacs24,ido,ruby-mode,Emacs,Emacs24,Ido,Ruby Mode,在emacs初学者工具包中,v1具有C-x C-i(或ido imenu)(类似于Sublime Text的Cmd+R)。在emacs初学者工具包中,v2缺少此功能。我找到并尝试重新创建功能。当这个idoimenu在elisp模式下工作时,它在ruby模式下停止工作。我得到: imenu--make-index-alist: No items suitable for an index found in this buffer 有人想出办法让它工作吗 为什么要从Emacs24中删除这个 此功能

在emacs初学者工具包中,v1具有
C-x C-i
(或
ido imenu
)(类似于Sublime Text的Cmd+R)。在emacs初学者工具包中,v2缺少此功能。我找到并尝试重新创建功能。当这个
idoimenu
elisp模式下工作时,它在
ruby模式下停止工作。我得到:

imenu--make-index-alist: No items suitable for an index found in this buffer
  • 有人想出办法让它工作吗
  • 为什么要从Emacs24中删除这个
  • 此功能是否有新的替代品

  • 由于该函数是ESK的一部分(与Emacs的问题相反),因此您可能最好向上游报告错误。另一方面,ESK的主要竞争对手Emacs Prelude也提供了相同的功能(默认情况下绑定到C-CI),并且它似乎可以在Emacs 24中的ruby模式下正常工作。您可以在
    ido imenu

    上找到更多信息,因为该函数是ESK的一部分(与Emacs的问题相反),所以您可能最好向上游报告错误。另一方面,ESK的主要竞争对手Emacs Prelude也提供了相同的功能(默认情况下绑定到C-CI),并且它似乎可以在Emacs 24中的ruby模式下正常工作。你可以在
    idoimenu

    上找到更多信息,所以在再次阅读了emacs wiki上的内容后,我终于找到了答案

    简短回答:您需要将此位添加到自定义中。请随意向列表中添加更多类型(我只对方法感到满意)

    Longer answer:我首先尝试定义一个
    ruby-imenu-generic expression
    函数,并使用
    ruby-mode-hook
    将其设置为
    imenu-generic expression

    (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)
    
    但是,这不起作用(我会得到与以前相同的错误)。更多的阅读给我指明了方向。现在,我不是
    elisp
    专家,所以我的假设是:基本上,上述方法适用于

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


    foo模式
    的示例清楚地说明了如何为
    ruby模式
    执行此操作。因此,
    ruby模式
    似乎没有real
    imenu泛型表达式
    变量的缓冲区本地副本。我仍然无法解释为什么它在Emacs 23.2(使用ESK v1)中有效,但在Emacs 24上无效,但至少我找到了一个有效的解决方案。

    因此,在再次阅读Emacs wiki上的文章后,我终于找到了答案

    简短回答:您需要将此位添加到自定义中。请随意向列表中添加更多类型(我只对方法感到满意)

    Longer answer:我首先尝试定义一个
    ruby-imenu-generic expression
    函数,并使用
    ruby-mode-hook
    将其设置为
    imenu-generic expression

    (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)
    
    但是,这不起作用(我会得到与以前相同的错误)。更多的阅读给我指明了方向。现在,我不是
    elisp
    专家,所以我的假设是:基本上,上述方法适用于

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


    foo模式
    的示例清楚地说明了如何为
    ruby模式
    执行此操作。因此,
    ruby模式
    似乎没有real
    imenu泛型表达式
    变量的缓冲区本地副本。我仍然无法解释为什么它在Emacs 23.2(使用ESK v1)中有效,但在Emacs 24上无效,但至少我找到了一个有效的解决方案。

    Emacs+Emacs初学者工具包!=Emacs.Emacs+Emacs初学者工具包!=在我的问题中,我链接到的文件表明ido imenu不是ESK的一部分。更多的谷歌搜索表明它是Emacs23的一部分,但在Emacs24中被删除了。这就是我问这个问题的原因。谢谢。最终,我越来越多地阅读了你提供的链接,找到了答案。我在问题中链接到的内容表明ido imenu不是ESK的一部分。更多的谷歌搜索表明它是Emacs23的一部分,但在Emacs24中被删除了。这就是我问这个问题的原因。谢谢。最终,通过阅读你提供的链接,我找到了答案。