我可以在不包含函数定义的缓冲区中使用imenu模式吗?

时间:2014-03-14 07:31:28

标签: emacs

似乎imenu不会索引普通缓冲区(如纯文本),而是在代码缓冲区中索引函数定义(例如,在java文件中)。

每当我运行 M-x imenu时,它会说

Index item:

但在当前缓冲区中找不到任何内容。我觉得我使用的方式不对,但在网上找不到任何内容。

下面是截图。enter image description here

1 个答案:

答案 0 :(得分:2)

您无需在缓冲区中使用函数定义即可使用imenu。但是在这种情况下,您需要告诉它如何索引项目。一种方式(在我看来最简单)是使用变量imenu-generic-expression。它基本上是指示imenu如何创建索引的参数列表。每个参数都有特定的格式。您可以通过 Ch v imenu-generic-expression RET 来阅读变量的文档(以及参数的格式)。

下面是一个可以在shell模式缓冲区中使用的简单示例,用于索引环境变量赋值。

(setq imenu-generic-expression '((nil "^\\([A-Z_]+\\)=.*" 1)))

上述表达式指示imenu

1)搜索字符串匹配"^\\([A-Z_]+\\)=.*"

2)将regexp中第一个匹配的子表达式用作imenu索引

3)第一个元素nil表示给定表达式的imenu项应该在顶级索引

您可以在shell模式缓冲区中设置此项,方法是在init文件中添加以下内容(请勿执行此操作,请参阅下面的编辑)

(add-hook 'sh-mode-hook (lambda ()
                      (setq imenu-generic-expression '((nil "^\\([A-Z_]+\\)=.*" 1)))))

修改

sh-mode确实提供了imenu索引,但它仅限于函数定义(感谢@lunaryorn指出这一点)以指出这一点。您可以通过执行以下

之类的操作,将imenu提供的imenu与您的自定义正则表达式结合起来
(defun my-shell-mode-setup-imenu ()
  (setq imenu-generic-expression (append '((nil "^\\([A-Z_]+\\)=.*" 1)) 
                                         (nthcdr 1 (car sh-imenu-generic-expression)))))

(add-hook 'sh-mode-hook 'my-shell-mode-setup-imenu)