似乎imenu不会索引普通缓冲区(如纯文本),而是在代码缓冲区中索引函数定义(例如,在java文件中)。
每当我运行 M-x imenu
时,它会说
Index item:
但在当前缓冲区中找不到任何内容。我觉得我使用的方式不对,但在网上找不到任何内容。
下面是截图。
答案 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指出这一点)以指出这一点。您可以通过执行以下
(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)