2012年10月5日 星期五

在 vim 內直接搜尋專案目錄下的字串

以前用 id-utils 為底, 寫了個小程式 gj, 用來搜索目錄下的關鍵字。基本上 gj 已滿足我八成的需求, 不過有時還是覺得若能在vim 內搜尋就更方便, 不用複製目前游標下的字串、開新視窗、貼上字串、執行 gj

最近找到 ack.vim, 發現完全符合我的需求, 只不過它是用 ack 搜尋, 不是用 id-utils, 檔案多的時候搜尋速度較慢。ack.vim 用 vim 的 grep + quickfix 達成目的, 只要改用 id-utils 作索引和搜尋即可, 剩下部份可直接拿來用, 沒花多少工夫就改好了。

安裝方式如下:

  1. sudo apt-get install id-utils
  2. wget https://raw.github.com/fcamel/configs/master/.vim/plugin/ack.vim && mv ack.vim /.vim/plugin/
  3. wget https://raw.github.com/fcamel/configs/master/bin/gid_with_col.py && chmod +x gid_with_col.py && mv gid_with_col.py /bin
  4. $ cat << EOF >> ~/.vimrc
    let g:ackprg="gid_with_col.py"
    nnoremap <silent> <Leader>g :Ack<CR>
    EOF
    

  5. $ cd /path/to/project && mkid # 建立索引
接下來在專案目錄下用 vim 編輯檔案, 按 \g 就會搜索目前游目標下的字串, 在下方開啟索尋結果。或是用 :Ack <pattern> <pattern2> ... 做更細的搜尋。

用法參見 ack.vim:

o    to open (same as enter)
go   to preview file (open but maintain focus on ack.vim results)
t    to open in new tab
T    to open in new tab silently
v    to open in vertical split
gv   to open in vertical split silently
q    to close the quickfix window
不過我將 t 的功能註解掉了, 需要的人請自行修改 ack.vim 去掉註解。

4 則留言:

  1. 另外參考 ag: the silver searcher ;-) 最近才知道這個也比 Ack 快。 http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/ search also ag.vim

    回覆刪除
  2. 謝啦, 不過 id-utils 有先建 index 再做搜尋, 基本上已快到無法超越的地步了, 符合搜尋的結果不多的話, 都是 0.1s 以內完成。

    Btw, 之前好像是聽 Thinker 推薦才知道 id-utils 的

    回覆刪除
  3. 正好這幾天我也在 survey 相關的訊息,目的是加快搜尋大型 codebase (如 android SDK) 的速度,找到了一個叫 OpenGrok 的 tool, stackoverflow 也有人推薦,只是安裝有點麻煩,但是功能很不錯,可以一起試試

    回覆刪除
  4. id-utils 安裝和設定都簡單, 速度也超快, 用起來相當滿意。之後有別的需求時再來看看 OpenGrok, 謝啦

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...