Re: [vim ] NeoComplCache
看板Editor (編輯器(vim/emacs))作者timwu (Tim Wu)時間14年前 (2010/05/30 17:21)推噓0(0推 0噓 0→)留言0則, 0人參與討論串2/2 (看更多)
※ 引述《dryman (dryman)》之銘言:
: 轉貼自 http://sinolog.it/?p=1399
幫你轉正體重貼, 請多愛用chrome extension 同文堂, single click就可以轉.
----------------------------------------------------------------------
Vim的終極自動補全插件:NeoComplCacheVim的終極自動補全插件:NeoComplCache
2010年02月27日 星期六 , 1,798 次點擊
關於自動補全,最初用的是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鍵選擇列表中的選項了。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.193.248.49
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Editor 近期熱門文章
PTT數位生活區 即時熱門文章