加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

挖掘Emacs Imenu的潜力

发布时间:2020-12-14 03:35:24 所属栏目:大数据 来源:网络整理
导读:作者: Jolly Wing(jiqingwu@gmail.com)日期: 2014-05-15声明:转载请保留作者信息 Imenu介绍 imenu是Emacs自带的一个工具,它能够分析当前缓冲区中的定义,并生成索引。 Imenu不仅能分析程序源文件,也能分析格式化的文档,比如HTML,Tex 以及轻量化标记语言
作者: Jolly Wing(jiqingwu@gmail.com)
日期: 2014-05-15
声明:转载请保留作者信息

Imenu介绍

imenu是Emacs自带的一个工具,它能够分析当前缓冲区中的定义,并生成索引。

Imenu不仅能分析程序源文件,也能分析格式化的文档,比如HTML,Tex 以及轻量化标记语言 (rst,
markdown,emacs org等)。

对于程序源文件,它主要生成函数定义的索引。
(WhichFunction模式就是使用了imenu生成的索引信息,speedbar也使用了imenu生成的信息)。

对于结构化文档,它生成标题和章节的大纲。

使用Imenu

我们打开一个C的源文件,里面定义了几个函数。
M-x imenu 回车,imenu会提示你输入要跳转到那个符号定义。
我们按TAB,imenu就会把在一个缓冲区中列出所有的函数定义。
我们根据提示输入某个函数的名字,按回车跳转到定义处。

这样似乎不是很方便,我们可以 M-x imenu-add-menubar-index
这时候菜单中多出一个Index的菜单,打开Index,里面就是imenu生成的索引。
用鼠标点击就可以导航了,方便多了吧。

我们可以设置在编辑某种主模式的文件时,imenu的索引自动出现在菜单中。
比如,我想在编辑c程序的时候,使用imenu的菜单索引。

(add-hook 'c-mode-hook 'imenu-add-menubar-index)

如果想要所有模式下都在菜单栏显示imenu的索引,可以用EmacsWiki上的技巧:
因为你在进入某个主模式后,会运行 font-lock-mode。(注意,假设你已经 (setq global-font-lock-mode t))。
你可以把 imenu-add-menubar-index 加在 font-lock-mode-hook 上。
用下面代码,你可以在任何支持imenu的buffer的菜单栏加入imenu索引。

(defun try-to-add-imenu ()
  (condition-case nil (imenu-add-to-menubar "Imenu") (error nil)))
(add-hook 'font-lock-mode-hook 'try-to-add-imenu)

我们发现Imenu菜单中有个 *Rescan* 项,它的作用是告诉imenu扫描缓冲区,重新生成索引。
有时,当我们更改了文件,Imenu并没有更新,这时我们就要按一下 *Rescan*

imenu的扩展

  • icicle-imenu: 可以分类浏览Index,比如专门看函数、变量、宏等。
  • imenu+: 拓展imenu,可以支持开关函数,是否按某种方式排序,是否显示注释中的索引等。
  • imenu-anywhere: 以IDO的方式
    显示所有打开的同类buffer中的索引。当你写只有几个源文件的小项目时,这个就差不
    多够用了。

高级用法:自定义Imenu

Imenu能支持很多模式。
但有的主模式并不支持imenu,这是因为在主模式定义时并没有定义 imenu-generic-expression
这时,我们可以自己为该模式定义 imenu-generic-expression,不过比较复杂。
看 EmacsWiki 上的例子,为sql模式定义 imenu-generic-expression

(setq sql-imenu-generic-expression
       '(("Comments" "^-- (.+)" 1)
     ("Function Definitions" "^s-*(function|procedure)[ nt]+([a-z0-9_]+)
 [ nt]*([a-z0-9 _,nt]*)[ nt]*(return[ nt]+[a-z0-9_]+[ nt]+)?[ai]sb" 2)
     ("Function Prototypes" "^s-*(function|procedure)[ nt]+([a-z0-9_]+)
 [ nt]*([a-z0-9 _,nt]*)[ nt]*(return[ nt]+[a-z0-9_]+[ nt]*)?;" 2)
     ("Indexes" "^s-*creates-+indexs-+(w+)" 1)
     ("Tables" "^s-*creates-+tables-+(w+)" 1)))

(add-hook 'sql-mode-hook 
        (lambda ()
           (setq imenu-generic-expression sql-imenu-generic-expression)))

总的来说,当我们编写小的项目和结构化文档时,imenu是个很实用的小工具。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读