VIM的自動補全功能讓你有效的避免輸入錯誤,快速的完成變數名、類名、方法名的輸入,善用之可以極大的提高軟體開發的工作效率。需要提前說明的是,下面介紹的所有快捷鍵必須讓VIM位於插入模式(即"i"Insert And Replace"模式)。VIM的自動補全方式一共有三種
已知單詞
這是VIM中最基本的功能,當你鍵入某個單詞的前幾個字母,然後按<C-p>,VIM會自動搜尋所有當前開啟的緩衝區中的單詞完成自動補全。<C-p>表示VIM從當前游標位置向前搜尋,你也可以按<C-n>,表示從當前游標位置向前搜尋。通常我們可以忽略<C-n>和<C-p>的區別。為了方便記憶,我選擇按<C-p>,因為p代表previous,<C-p>表示補全之前(previous)已經鍵入的單詞. 下面兩個圖分別是<C-n>和<C-p>的效果圖,區別在於在自動補全選單彈出時預設高亮的單詞
另外,如果你開啟的檔案太多,那麼自動補全可能會列出一大串來自其他緩衝區中的單詞,這時可以使用<C-x><C-p>或者<C-x><C-n>讓VIM僅僅列出當前緩衝區的單詞。
關鍵詞字典
前面講到,透過<C-x><C-p>可以使VIM僅僅根據當前緩衝區的內容補全單詞,其中,<C-x>表示讓VIM進入插入模式的一個子模式,透過EX命令"help ins-complete"可以查閱所有以<C-x>開頭的快捷鍵說明,但這不是本文的重點,不再累述。基於關鍵字字典補全的快捷鍵為<C-x><C-k>, ‘k’表示"keyword",即關鍵字。當<C-x><C-k>按下時,VIM會從"dictionary"全域性變數中搜索字典檔案,進行自動補全的工作。詞典的另一個作用是可以做拼寫檢查,快捷鍵是<C-x><C-S>。關於如何利用VIM做拼寫檢查,將另行撰文介紹。
執行 ":set dictionary+=[字典檔案]" 設定字典檔案的路徑,執行<C-x><C-k>進行自動補全。
Omnicompletefunc
自版本7.0開始,VIM開始提供自動補全的回撥函式,透過下面的快捷鍵觸發:
omnifunc和completefunc兩個回撥函式沒有本質上的區別,但是在慣例上,omnifunc定義的函式的與特定的檔案型別繫結的,不同的檔案型別會定義不同的omnifunc。<C-x><C-o>中的’o",即’omnifunc’。而completefunc通常是給第三方外掛或者說使用者自定義使用的,<C-x><C-u>中的’u",即"User Defined"的意思。
如何編寫omnifunc或者completefunc的方法,可透過"help complete-functions"查閱,本文重點在於介紹兩個重要的外掛,就使用了這兩個函式實現C/C++語言的自動補全功能:
VIM的哲學就是儘量的減少使用者需要鍵入的次數,因此<C-x>開頭的快捷鍵也顯得過於麻煩,"help ins-completion"參考手冊中有一個例子函式,CleverTab(),在使用者按下<Tab>鍵時,自動判斷是否需要呼叫補全功能還是插入一個<Tab>字元,但是這還不能滿足我們日常軟體開發的需要,因此supertab外掛是對VIM的自動補全功能的重要補充。在預設情況下supertab就能很好的工作,不需要特別的設定。需要特別說明的是,這個外掛是對下面介紹的外掛OmniCppComplete的一個有效的補充。主要是因為如果不安裝supertab,那麼在進行自動補全的時候,需要按<C-x><C-o>進行觸發。
如前所述,當你在編寫C/C++程式碼時,如果需要VIM為你自動補全函式名、類名等,需要依賴正確的omnifunc(或者completefunc)的實現,而OmniCppComplete正是應這個需求而出現的。安裝好這個外掛後,也不需要做任何設定,只需要生成相應的tag檔案即可正常工作。需要注意的是,在生成tag檔案時,需要使用下面的引數達到最好的效果:
ctags --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q
下面是使用OmniCppComplete的效果圖:
本文重點在於介紹VIM的自動補全功能,因此對於C、C++語言中自動補全功能並未作深入的探討。眾所周知,VIM中對C++語言的自動補全有一些缺陷,目前有一些外掛如clang_complete、gccsense能夠更好的完成C/C++語言的自動補全功能,將另行撰文介紹。多說一句,其實在大多數情況下,利用這些基本的自動補全功能也夠用了。特別是針對歷史遺留程式碼居多的大規模專案,這些最基本的功能反而是最有效率的。
VIM的自動補全功能讓你有效的避免輸入錯誤,快速的完成變數名、類名、方法名的輸入,善用之可以極大的提高軟體開發的工作效率。需要提前說明的是,下面介紹的所有快捷鍵必須讓VIM位於插入模式(即"i"Insert And Replace"模式)。VIM的自動補全方式一共有三種
已知單詞
這是VIM中最基本的功能,當你鍵入某個單詞的前幾個字母,然後按<C-p>,VIM會自動搜尋所有當前開啟的緩衝區中的單詞完成自動補全。<C-p>表示VIM從當前游標位置向前搜尋,你也可以按<C-n>,表示從當前游標位置向前搜尋。通常我們可以忽略<C-n>和<C-p>的區別。為了方便記憶,我選擇按<C-p>,因為p代表previous,<C-p>表示補全之前(previous)已經鍵入的單詞. 下面兩個圖分別是<C-n>和<C-p>的效果圖,區別在於在自動補全選單彈出時預設高亮的單詞
另外,如果你開啟的檔案太多,那麼自動補全可能會列出一大串來自其他緩衝區中的單詞,這時可以使用<C-x><C-p>或者<C-x><C-n>讓VIM僅僅列出當前緩衝區的單詞。
關鍵詞字典
前面講到,透過<C-x><C-p>可以使VIM僅僅根據當前緩衝區的內容補全單詞,其中,<C-x>表示讓VIM進入插入模式的一個子模式,透過EX命令"help ins-complete"可以查閱所有以<C-x>開頭的快捷鍵說明,但這不是本文的重點,不再累述。基於關鍵字字典補全的快捷鍵為<C-x><C-k>, ‘k’表示"keyword",即關鍵字。當<C-x><C-k>按下時,VIM會從"dictionary"全域性變數中搜索字典檔案,進行自動補全的工作。詞典的另一個作用是可以做拼寫檢查,快捷鍵是<C-x><C-S>。關於如何利用VIM做拼寫檢查,將另行撰文介紹。
執行 ":set dictionary+=[字典檔案]" 設定字典檔案的路徑,執行<C-x><C-k>進行自動補全。
Omnicompletefunc
自版本7.0開始,VIM開始提供自動補全的回撥函式,透過下面的快捷鍵觸發:
<C-x><C-o>: 呼叫omnifunc定義的函式<C-x><C-u>: 呼叫completefunc定義的函式omnifunc和completefunc兩個回撥函式沒有本質上的區別,但是在慣例上,omnifunc定義的函式的與特定的檔案型別繫結的,不同的檔案型別會定義不同的omnifunc。<C-x><C-o>中的’o",即’omnifunc’。而completefunc通常是給第三方外掛或者說使用者自定義使用的,<C-x><C-u>中的’u",即"User Defined"的意思。
如何編寫omnifunc或者completefunc的方法,可透過"help complete-functions"查閱,本文重點在於介紹兩個重要的外掛,就使用了這兩個函式實現C/C++語言的自動補全功能:
supertabVIM的哲學就是儘量的減少使用者需要鍵入的次數,因此<C-x>開頭的快捷鍵也顯得過於麻煩,"help ins-completion"參考手冊中有一個例子函式,CleverTab(),在使用者按下<Tab>鍵時,自動判斷是否需要呼叫補全功能還是插入一個<Tab>字元,但是這還不能滿足我們日常軟體開發的需要,因此supertab外掛是對VIM的自動補全功能的重要補充。在預設情況下supertab就能很好的工作,不需要特別的設定。需要特別說明的是,這個外掛是對下面介紹的外掛OmniCppComplete的一個有效的補充。主要是因為如果不安裝supertab,那麼在進行自動補全的時候,需要按<C-x><C-o>進行觸發。
OmniCppComplete如前所述,當你在編寫C/C++程式碼時,如果需要VIM為你自動補全函式名、類名等,需要依賴正確的omnifunc(或者completefunc)的實現,而OmniCppComplete正是應這個需求而出現的。安裝好這個外掛後,也不需要做任何設定,只需要生成相應的tag檔案即可正常工作。需要注意的是,在生成tag檔案時,需要使用下面的引數達到最好的效果:
ctags --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q
下面是使用OmniCppComplete的效果圖:
本文重點在於介紹VIM的自動補全功能,因此對於C、C++語言中自動補全功能並未作深入的探討。眾所周知,VIM中對C++語言的自動補全有一些缺陷,目前有一些外掛如clang_complete、gccsense能夠更好的完成C/C++語言的自動補全功能,將另行撰文介紹。多說一句,其實在大多數情況下,利用這些基本的自動補全功能也夠用了。特別是針對歷史遺留程式碼居多的大規模專案,這些最基本的功能反而是最有效率的。