挖掘Emacs Imenu的潛力

做者: Jolly Wing(jiqingwu@gmail.com)
日期: 2014-05-15
聲明:轉載請保留做者信息

Imenu介紹

imenu是Emacs自帶的一個工具,它可以分析當前緩衝區中的定義,並生成索引。git

Imenu不只能分析程序源文件,也能分析格式化的文檔,好比HTML,Tex 以及輕量化標記語言 (rst,
markdown, emacs org等)。github

對於程序源文件,它主要生成函數定義的索引。
(WhichFunction模式就是使用了imenu生成的索引信息,speedbar也使用了imenu生成的信息)。sql

對於結構化文檔,它生成標題和章節的大綱。express

使用Imenu

咱們打開一個C的源文件,裏面定義了幾個函數。
M-x imenu 回車,imenu會提示你輸入要跳轉到那個符號定義。
咱們按TAB,imenu就會把在一個緩衝區中列出全部的函數定義。
咱們根據提示輸入某個函數的名字,按回車跳轉到定義處。markdown

這樣彷佛不是很方便,咱們能夠 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索引。code

(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\\)[ \n\t]+\\([a-z0-9_]+\\)\
 [ \n\t]*([a-z0-9 _,\n\t]*)[ \n\t]*\\(return[ \n\t]+[a-z0-9_]+[ \n\t]+\\)?[ai]s\\b" 2)
     ("Function Prototypes" "^\\s-*\\(function\\|procedure\\)[ \n\t]+\\([a-z0-9_]+\\)\
 [ \n\t]*([a-z0-9 _,\n\t]*)[ \n\t]*\\(return[ \n\t]+[a-z0-9_]+[ \n\t]*\\)?;" 2)
     ("Indexes" "^\\s-*create\\s-+index\\s-+\\(\\w+\\)" 1)
     ("Tables" "^\\s-*create\\s-+table\\s-+\\(\\w+\\)" 1)))

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

總的來講,當咱們編寫小的項目和結構化文檔時,imenu是個很實用的小工具。

相關文章
相關標籤/搜索