我的 FuzzyFinder 壞掉了

忘了何時開始,本機 FuzzyFinder 初次打開時,如果前幾個字輸入太快,就會「過早自動完成」補成一條無效候選。

例如 FufFile 的 mapping 是 ,f 的話,輸入 ,ff 就會出現下圖狀況,非常惱人。

過早自動完成是萬惡的根源

調查不出原因,只好放棄,反正沒人維護了,就跟 FuzzyFinder 說拜拜吧。

最後一張照片,親愛的 fuf

用了三年的 FuzzyFinder 介面

替代品當然是 unite.vim

之前寫過一篇簡介「試試新的萬能尋找器 unite.vim」,那時就它用來輔助 FuzzyFinder 了,選 action 的介面有時候真的比較方便,現成的實用 source 又多。

而且 2011 至今,幾乎每次跑 BundleInstall 都看到它在更新,相當驚人。 回報 bug 很快就會被處理,這點相當酷。

豪放的大視窗

Unite buffer 開出來整個外觀如下圖,分割位置、寬或高、buffer 名稱、訊息(兩行 [file_rec] 的部分)都可以調整。

Unite file_rec 整體外觀

輸入方式(narrowing 語法)的變更

需要重新習慣的不多:

  1. FuzzyFinder 以 ; 分隔多個關鍵字,在 unite.vim 改用空白。
  2. 離開 Insert Mode 不會直接退出 unite buffer,要用另外的 mapping 才行。

而關鍵字與候選範圍的比對關係,在 unite.vim 被抽出為 matcher,可以用 unite#filters#matcher_default#use()unite#custom_source()unite#set_substitute_pattern() 等方式作細部調整。

Matcher 可以換成 matcher_regexp、matcher_fuzzy、……,可惜文件不清,我只能邊改邊試。

set_substitute_pattern 可以做到輸入 $HOME 展開 $HOME,輸入 gem/ 展開 ruby gem path,理論上應該能自由調整 narrowing 用語。 ※我是參考這篇 unite.vim の設定を一部晒してみる - 永遠に未完成調的。

我的 mappings

註:我認為分享 key mapping 無聊透頂,尤其選的按鍵只是習慣、沒有語義,那你改個按鍵也要分享一篇嗎?

這裡只是形容一下操作的感覺,有些按鍵是預設的、沒改。

  • ,ff - 開啟 Unite file 介面,由目前 buffer 所在目錄開始搜尋。
  • ; - 在 unite buffer Insert Mode 向前刪除一個 word,反悔或打錯字時用。
  • <Ctrl-J><Ctrl-K> - 移動到下一個/上一個候選。如果在 Insert Mode,會自動進入 Normal Mode,然後只要按 j k 就能上下移動。
  • <Tab> - 對選中的項目,開始選擇 action。
  • <CR> - 對選中的項目執行 default action,例如檔案的預設 action 我調成在新分頁開啟。
  • ,<CR> - 對選中的項目執目第二 default action(目前 unite.vim 沒有所謂第二 action,要自己設 mapping),我設定成在目前分頁開啟檔案。
  • <F5> - 在 unite buffer 中,重新整理,清除候選快取。
  • ,q - 退出一層 unite buffer。
  • ,Q - 退出全部 unite buffer。

API 與設定感覺

其實設計蠻漂亮的…… sourcekind 是要處理的情境和候選物件類型, action 是要執行的動作, filter 包含 matcher、sorter、converter 的微調。 以上定義清楚,設定時的指令自然會乾淨,這部分做得不錯,比 FuzzyFinder 進步多了。

比較惱人的是文件趕不上開發速度,英文不太講究、repo 裡的 commit message 也敘述不清。 有點難搞。

目前常用的 source

※更多 source,參考 unite plugins · Shougo/unite.vim Wiki

  • file - 最常用的就是這個。
  • file_mru (most recent used files)
    Unite file_mru
  • register - 多行內容也能顯示喔。
  • bookmark - 目錄、檔案、位置都通,比 fuf 方便。
  • help - 但要用 tags-caching 這個 branch 才有快取,否則實在太慢。
    Unite help
  • session
  • tab
  • outline - 有了這個,幾乎就沒在開 Tagbar 了(雖然我本來就少用 tag)。

還不大會用的其他功能

  1. file_rec source

    Fuf 要找深層目錄下的檔案,會使用 **/ 查詢。 Unite.vim 也能使用 **/ 寫法,我一般用這個就 OK 了。

    而 unite.vim 還有專門做深層搜尋的 file_rec source,作者也經常磨亮這個功能。 不過目錄樹很大時,總是會跑到 too many candiates(預設 1000 項),加大快取數又要跑很久。 解法應該是用另外的 file_rec/async source,可以非同步發動更快的搜尋,但需要裝別的東西,我就沒試了。

  2. Quick Match

    類似 EasyMotion 的選擇法,打一個鍵就能對某個項目動作。 還沒想到要用在哪,也許適合用在 bookmark 吧。

    :Unite -quick-match alignta

總之一下子就能習慣,早就可以換了

我目前的設定放在 bootleq/vimrc_human/.vimrc#L808-923 at 500f59,沒什麼特別的,doc 裡也有範例,純擺設。