版權所有:晴耕雨讀@【牧碼志】,如需轉載,請註明出處。
原文地址:http://0x3f.org/?p=1399
關於自動補全,最初用的是SuperTab,那個時候Vim的自動補全外掛程式寥寥無幾,也就SuperTab比較有名。不過實際使用過程中這個外掛程式給我的體驗不是很好,原因是補全的準確度不高。
後來出了一個新外掛程式,AutoComplPop,功能和使用都很簡單。但是很快我就又用回SuperTab,原因是AutoComplPop在輸入的同時即時地查詢匹配的關鍵詞,導致輸入極不流暢,效率很低。
一直就這麼湊合著用著SuperTab,隨著這個外掛程式版本的更新,舊功能不斷地完善,新功能也接二連三地引入,SuperTab在匹配關鍵詞的準確度上有了一些改善,但是新的問題又出現了。SuperTab後來加入一個新功能,對於程式源檔案,可以在其引入的檔案以及API檔案中匹配關鍵詞。比如假設我當前正在編輯a.php,在a.php中有include ‘b.php’;這樣的語句,當我輸入array並按下Tab鍵時,SuperTab不但會在當前檔案中查詢所有匹配項,還會到b.php中查詢,如果配置過vim、指定一個包含了php的API的檔案,則SuperTab還會自動從這個檔案中查詢匹配項。按理說這個功能的理念很好,但問題就在於SuperTab做的是即時查詢,如果源檔案中包含的檔案較多,各個檔案又較大,問題就顯而易見了。我不得不在寫程式時小心地使用Tab鍵,否則有時就會出現按一下Tab鍵然後等著Vim在那狂搜的情況。
前兩天發現了NeoComplCache,光看名字就讓我有點兒興奮,一般使用緩衝的速度都很快。這個外掛程式會在Vim開啟檔案的時候對上下文作一個索引,並把索引結果儲存到緩衝中。同時,檔案更改的內容會在儲存的時候被索引。此外,NeoComplCache支援多種關鍵詞索引模式,例如它會判斷當前路徑下的檔案或目錄的名字是否匹配補全條件,也可以從緩衝的程式語言API中匹配補全條件。到此為止,它就解決了SuperTab和AutoComplPop共同的效率問題,並具備它們各自的長處。看了一遍文檔,發現這個外掛程式的功能比較細緻,大概有以下一些特點:
1、使用緩衝,自動補全時效率高;
2、產生的關鍵詞列表準確;
3、支援底線分割的關鍵詞,如apple_boy_cat,就可以只輸入a_b_c,然後補全;
4、支援駝峰格式匹配關鍵詞,如AppleBoyCat,就可以只輸入ABC,然後補全;
5、既可以像AutoComplPop那樣在Vim中輸入的同時自動彈出補全列表,又可以自訂快速鍵手動觸發;
6、支援從檔案名稱和目錄名中匹配補全條件;
7、對於程式源檔案,支援從語言API中匹配補全條件;
NeoComplCache的缺點是文檔不全,雖然從隻言片語中發現它還支援Snippet,但從文檔中沒有找到足夠的有用資訊。加之一直用SnipMate感覺不錯,所以目前還是用它來實現snippet功能。
這就有個搭配問題:雖然NeoComplCache不存在補全時的效率問題,但我仍然打算只在需要補全時才用快速鍵觸發此功能,最主要的原因是我既希望用Tab鍵觸發SnipMate的代碼塊補全功能,又希望修SuperTab那樣用Tab選擇補全列表中的選項。也就是要達到只用Tab鍵就可以完成開啟自動補全列表、補全列表選項選擇和SnipMate代碼塊替換的效果。但是,如果將Tab映射到觸發自動補全,則補全列表選擇和SnipMate均無法使用Tab,反之亦然。
所以我想如果能讓NeoComplCache、SuperTab、SnipMate和諧共存,那問題就解決了,幾經摸索,終於找到了辦法:
1、設定NeoComplCache不自動彈出補全列表,即在vimrc中加入:
let g:NeoComplCache_DisableAutoComplete = 1
2、由於NeoComplCache在手工模式下使用快速鍵組合<C-X><C-U>
開啟補全列表,故設定SuperTab的預設補全操作為<C-X><C-U>
,即在vimrc中加入:
let g:SuperTabDefaultCompletionType = ‘<C-X><C-U>
‘
這樣,NeoComplCache只負責補全關鍵詞緩衝的產生,SuperTab控制Tab鍵的行為並在需要觸發補全操作時開啟補全列表、進而在列表中的選項間移動焦點,而當游標前的關鍵詞是snippet時,SnipMate會被優先調用並完成代碼塊的替換。
就在寫這篇文章的時候,我突然覺得NeoComplCache自動彈出補全列表+SnipMate的方式也挺好,只是這樣就不能用Tab鍵挑選清單中的選項了。