Vim 的 Omni completion 功能推出之時,同時有提供一個 syntaxcomplete 的 function 可以拿 syntax highlight 裡面的關鍵字來做自動完成,設定方法很簡單:
setlocal omnifunc=syntaxcomplete#Complete
這樣只要觸發 omnicomplete 的動作就會觸發這個 function ,列出 syntax 裡面有定義的關鍵字,不過他有一點小限制,就是該 syntax 設定檔裡面的 syntax group 名稱要是該檔案類型的 filetype 開頭的,例如 javascript 檔案就要 javascriptMethods, javascriptObjects 才會列入,如果是 jsPrototype, styles 為名稱的 group 就不會列出來,這其實也是 vim syntax file 寫作的習慣之一。
而除了這個限制之外,因為設定是直接用上 omnifunc,結果就是其他有自己專屬的 omnifunc 的語言就無法同時使用到 syntaxcomplete 的功能,不然就是要把觸發的指令切開,設定成不同的快速鍵。不過使用上就沒這麼方便,還好我用的 autocomplpop 有支援使用者自定義的函數,定義的函數介面和 omni complete functilon 一樣,所以我就加上兩行設定:
let g:acp_behaviorUserDefinedMeets = 'acp#meetsForKeyword'
let g:acp_behaviorUserDefinedFunction = 'syntaxcomplete#Complete'
結果就可以用 autocomplpop 內建的的 keyword 觸發條件來觸發 syntax complete,還算蠻符合需求的。
最後回來看一下 syntaxcomplete,這個 function 雖然是 Vim 內建的,不過其實也有放在 vimscript 上,而且上面還有比較新的版本,最近我有跟作者聯絡,或許還會再有新功能吧。另外就是 autocomplpop 很久沒更新了,所以我有 fork 一版出來自己加了些給 js, coffee, css 檔的預設行為,好像還修了一個 bug,本來有想接上新版的 snipMate,不過比想像的複雜不少,所以暫時放棄了。