2009/02/17

打造自己的VIM: 檔案搜尋 FuzzyFinder

小弟在為我心愛的VIM找如何快速尋找檔案的plugin時,不小心找到一個超強的plugin,[FuzzyFinder],FuzzyFinder的功能只能說強到爆炸,有了它真是為了VIM的愛好者帶來了巨大的便利性。

FuzzyFinder它能夠幫我們快速找到好幾種東東,那些東東包含了:
  • Buffer (已開啟的檔案)
  • File
  • Tagged file (找在tag裡頭的檔案)
  • Most recently used(MRU) files (最近開過的檔案)
  • Directory (快速切換工作目錄)
  • Bookmark (使用FuzzyFinder建立及使用書籤)
  • Tag (模糊比較tag檔內的keyword)
  • MRU-Command (最近使用過的指令)

它的安裝方式請自己去官網下載.vim,再將.vim放到plugin裡面。以下我將只介紹如何使用它來找檔案及找tag功能,而其它功能因為用法太類似,所以各位就自行抓回去好好享受用它來開檔的快感吧。


File Mode

使用:FuzzyFinderFile指令來開啟FuzzyFinder的file mode,接著便能輸入一些pattern,FuzzyFinder就會幫我們找到類似的檔名,亦或者可以按下方向鍵的上下或Tab和Shift-Tab來直接選擇檔案。如下圖:



若是在資料匣上按下Enter,FuzzyFinder會幫我們自動補齊資料匣名,若是在檔案上則會直接開啟檔案,而開啟檔案的方式還有很多種,各位可以自己去參考文件,或是文章下面的指令彙整有稍微提到。

剛才的搜尋只限定在同一資料匣內,若我們想在搜尋資料匣內包含子資料匣內的檔案的話我們可以使用**\的wildcard,舉例來說,若我要在當前資料匣包含所有子資料匣內找1.txt這個檔案,我就可以打**\1.txt。(**這個符號不只針對FuzzyFinder是這個意思,在VIM中的一些其他地方,像某些built-in function也是這個意思)。下圖是我在arch資料匣找所有的.S檔案。


Tag Mode

FuzzyFinder的Tag mode有2種用法,一是不帶參數,第二則是帶參數。不帶參數如下圖,


它的用法跟File mode差不多,一樣先執行:FuzzyFinderTag,接著輸入tag來找tag檔內的關鍵字。但使用這種模式前,請先確認自己有tag file,若是不知道如何產生tag file,可以參考我[之前的文章]安裝並設定ctags,接著再參考[另一篇文章]產生tag file。

以上是第一種用法。第2種用法是有帶參數的,其用法為:FuzzyFinderTag 關鍵字。這邊我會加上快速鍵Ctrl+\,因為在某些時候FuzzyFinderTag會比Ctrl+t好用。快速鍵的語法如下:

map <silent> <C-\> :FuzzyFinderTag! <C-r>=expand('<cword>')<CR><CR>

配置好了,以後就只需在要查的關鍵字上按下Ctrl+\便能用FuzzyFinderTag來查詢,下圖是個範例,我在unwind_init函式上按下Ctrl+\則FuzzyFinderTag便直接開始查詢我要找的關鍵字。




指令彙整

以下我整理了一些關於FuzzyFinder的指令:

:FuzzyFinderBuffer " launchs Fuzzyfinder as Buffer mode.
:FuzzyFinderFile " launchs Fuzzyfinder as File mode.
:FuzzyFinderDir " launchs Fuzzyfinder as Directory mode.
:FuzzyFinderMruFile " launchs Fuzzyfinder as MRU-File mode.
:FuzzyFinderMruCmd " launchs Fuzzyfinder as MRU-Command mode.
:FuzzyFinderBookmark " launchs Fuzzyfinder as Bookmark mode.
:FuzzyFinderTag " launchs Fuzzyfinder as Tag mode.
:FuzzyFinderTaggedFile " launchs Fuzzyfinder as Tagged-File mode.


開啟選擇選項可以以下面這幾種模式:
<cr> - opens in a previous window.
<c-j> - opens in a split window.
<c-k> - opens in a vertical-split window.
<c-]> - opens in a new tab page.


其他:
<c-l> or <c-o> " To Switch the mode without leaving Insert mode.
<c-t> " If you want to temporarily change whether or not to ignore case
<c-e> " 暫時關閉pop視窗
<c-x><c-u> " 重新打開pop視窗
:FuzzyFinderRemoveCache " 刪除Cache資料



快速鍵及目錄

小弟新增以下幾個常用功能為快速鍵,將這些加入自己.vimrc吧。

map ff <esc>:FuzzyFinderFile<cr>
map fcd <esc>:FuzzyFinderDir<cr>
map fba <esc>:FuzzyFinderAddBookmark<cr>
map fbl <esc>:FuzzyFinderBookmark<cr>
map fu <esc>:FuzzyFinderBuffer<cr>
map <silent> <c-\> :FuzzyFinderTag! <c-r>=expand('<cword>')<cr><cr>
map <c-f12> <esc>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr>


目錄部分則是,加在Tools裡頭,截圖如下:



其script為以下那幾行,各位可以加在自己的.vimrc也可以加在menu.vim,或是有人懶得自己加,可以直接抓我的[menu.vim]回去用。
an 40.310.10 &Tools.F&uzzyFinder.&File<tab>ff <esc>:FuzzyFinderFile<cr>
an 40.310.10 &Tools.F&uzzyFinder.Tag&File <esc>:FuzzyFinderTaggedFile<cr>
an 40.310.20 &Tools.F&uzzyFinder.&Dir<tab>fcd <esc>:FuzzyFinderDir<cr>
an 40.310.30 &Tools.F&uzzyFinder.&Bookmark<tab>fbl <esc>:FuzzyFinderBookmark<cr>
an 40.310.40 &Tools.F&uzzyFinder.&BookmarkAdd<tab>fba <esc>:FuzzyFinderAddBookmark<cr>
an 40.310.50 &Tools.F&uzzyFinder.B&uffer<tab>fu <esc>:FuzzyFinderBuffer<cr>
an 40.310.60 &Tools.F&uzzyFinder.&Tag <esc>:FuzzyFinderTag<cr>
an 40.310.70 &Tools.F&uzzyFinder.MRU-&File <esc>:FuzzyFinderMruFile<cr>
an 40.310.80 &Tools.F&uzzyFinder.MRU-&Command <esc>:FuzzyFinderMruCmd<cr>
an 40.310.90 &Tools.F&uzzyFinder.-SEP1- <nop>
an 40.310.100 &Tools.F&uzzyFinder.ClearCache <esc>:FuzzyFinderRemoveCache<cr>


No comments: