2011-11-18 71 views
4

例如,當我輸入'inclu'時,是否有一種方法可以將它完成爲'include'? 謝謝。如何在vim中自動完成c或C++關鍵字

+1

在vim wiki網站上有關於C++ omni-completion的[this](http://vim.wikia.com/wiki/C%2B%2B_code_completion)文章。 – dave

+1

':help ins-completion'是最權威的參考。 – sarnold

回答

3

大部分vim的(複雜)自動完成是通過^X鍵映射完成的。 ^X^]將基於由ctags(1)生成的標籤自動完成。 ^X^P將在可用於完成的文件中查找以前的關鍵字。 ^X^K查看完成詞的可配置dictionary^X^I查看包含的文件並彈出一個菜單,用於從這些文件中完成關鍵字。 ^X^D#define完成。

也許最簡單的方法就是在文件中輸入一次#include <...>。然後可以通過#incl^X^P處理要包含的第二個文件,然後繼續。

如果你想稍微放更多的精力進去,創建一個~/.vim/dict文件,要自動完成,將文件添加到dictionary變量(:help dictionary)的關鍵字,並使用^X^K插入它。

+3

'^ N'也完成'include'到'include'並且它比'^ X^P'(或'^ X^N')更短 – Ves

+0

@Ves:Ha!我從來沒有找到更好的捷徑。這應該是一個答案,值得十點。 :) – sarnold

+2

@Ves:是的,但速度較慢,因爲它會搜索所有打開的緩衝區。 'CTRL-X CTRL- [NP]'只在當前緩衝區中搜索。 – Benoit

2

也許,像Snipmate或UltiSnips之類的任何插件都會對你有所幫助。

1

Snipmate默認執行此操作。鍵入'inc'然後按Tab,它會轉換成
#include <stdio.h>

1

你可以設置一些Vim的縮寫來爲你做這個。

iab inC#include "" 
iab InC#include <> 

然後鍵入inc<SPACE> Vim會自動擴展爲#include ""。您可以添加各種縮寫以減少所需的擊鍵次數。

如果你想進一步推進,我將分享一個小小的正在進行的實驗來創建一個C++'shorthand'。雖然它確實減少了輸入代碼所需的按鍵次數,但我還沒有足夠長的時間來確定記住速記所增加的複雜性是否值得。 (可能不是!)

您需要安裝UltiSnips才能正常工作。你可以使用Vim的縮寫功能做大部分工作,但我發現它最適合用專門的片段完成器。

一旦安裝了UltiSnips,您已經可以使用一些C和C++代碼片段,包括上面提到的#include ""示例。

我在cpp.snippets文件中添加了以下內容(加上很多很多!)。

snippet sptr "std::shared_ptr<type>" 
std::shared_ptr< ${1:type} > 
endsnippet 

當我想一個shared_ptr I型sptr,按段完成的關鍵。 UltiSnips完成此爲std::shared_ptr<type>選擇type這個詞,這樣我就可以繼續輸入模板類型而不會暫停。

這個人爲的例子顯示了更多的簡寫。這是我可以鍵入的內容:

// <C> is where I would press the UltiSnip complete/next key. 
fun<C>sptr<C><C>load_widget<C>cu32<C>offset<C>, cc<C>name<C>ret<C>msptr<C>widget<C>offset<C>name<C>; 

它展開:

std::shared_ptr<widget> load_widget(const std::uint32_t offset, const char* name) 
{ 
    return std::make_shared<widget>(offset, name); 
} 

一個粗略的統計顯示這降低了大約136擊鍵下降到100。Omnicomplete或YouCompleteMe插件,這是爲進一步降低可變並且功能名稱通常可以在輸入前兩個或三個字符後完成。

我嘗試在創建類型的簡寫時使用此模式:[c]type[r|p]。對於可選的參考或指針,[c]是可選的const,[r][p]。 (rp,我的輸入比&*更容易)。例如,std::string具有以下簡寫:

str = std::string 
strp = std::string* 
strr = std::string& 
cstr = const std::string 
cstrp = const std::string* 
cstrr = const std::string& 

所以cstrr,最常見的在我的代碼,減少了19個按鍵(有一個空格)下降到只有6