2016-03-07 91 views
9

VIM的omnicomplete自動完成功能並不像預期的那樣工作。如何在INSERT模式下觸發omnicomplete/auto-completion鍵擊?

有沒有辦法讓它變得更聰明?就像監視環繞文字的上下文一樣? (例如,如果在評論或引用內不觸發)

我問,因爲與自動完成/ IDE中的IntelliSense(如Visual Studio,IntelliJ,Sublime和Atom)中的IntelliSense相比,切換到Vim後無法獲得愉快的地方(過去我已經將這些用於開發)。

的基本目標,這個問題:

  • 可以Omnicomplete在INSERT模式A-ZA-Z按鍵被觸發?我已經通過「。」觸發了它。點符號。
  • 如何獲取Omnicomplete插入func的參數?

我是Vim新幾個月,拼命試圖獲得順暢的工作流程。但是如果沒有一個很好的自動完成選項,雖然迫使我在學習我嘗試使用的代碼時更加警惕,但它比我過去使用的其他IDE慢得多。

Atom + Go-Plus

讓我們用Atom + Go-Plus檢查我的期望。

我有一個名爲func generate(entropy chan<- uint64)的func位於同一包中另一個Go文件的其他地方。

當我在第22行中鍵入字母g,我立即得到一個提示與相剋開始的一切:

Atom's autocomplete with Go-Plus

正如你可以看到,有3個選項,立即彈出(在前兩個我認爲只是代碼片段)。我可以使用箭頭鍵向下滾動到任一選項。

如果我選擇第三選項(或者,如果我繼續鍵入gen領域範圍縮小到只有1個選項),press enter的Atom/Visual Studio中/崇高所有填寫方法的細節對我來說:

atom with go-plus autocompletion

我沒有輸入任何上述內容。它被插入,我可以覆蓋細節,修改它們,或者僅僅關閉並繼續輸入。

的Vim + VIM-圍棋(真的Omnicomplete)

我們來比較一下與omnicomplete我目前(也許壞了嗎?)配置。我有這個在我的.vimrc:

set completeopt=longest,menuone

在VIM,如果我輸入gen,我得到的是什麼似乎是我的,我在這個緩衝輸入別處以前輸入的文本(只有在該緩衝區,而不是其他緩衝區)。如果我碰巧拼錯了某些東西,我會得到我之前輸入的用於打開vim的生活的拼寫錯誤版本。這告訴我有在工作中沒有智能感知/自動完成 - 只是一些監視我讓擊鍵:

vim with omnicomplete and autocomplete not working

正如你所看到的,自動完成不工作,因爲我打字。儘管如此,在其他地方也可以使用評論和字符串,我很喜歡vim如何記住我輸入的自由文本。

不確定Vim選項是否啓用此功能;但是,它不是自動完成的。現在

,我可以按CTRL-X + CTRL-O強制自動完成,並得到generate()展現出來:

vim with omnicomplete and autocomplete

這是更好的;但是,我希望它會在我輸入時向我顯示自動完成選項:不需要3次額外的擊鍵來實現它。這是整個編程幾個小時內發生的大量C-x C-o事件。

有沒有辦法讓Vim在INSERT模式下監視我的按鍵,並在有匹配的ctag或函數時顯示自動完成?這可能是此功能的答案。

自動完成功能與參數

有與omnicomplete自動完成,我可以忽略上述的CX共同需求,如果這工作了第二個問題:一旦我做選擇我要自動完成的方法,它不會插入我的參數/字段。

讓我們再回到上面的截圖中,如果我選擇的方法,這就是我得到:

vim with vim-go autocomplete not fully completing

注意它不會插入的FUNC的paramters。它與上面發佈的第二張圖片不匹配,Atom,Sublime和Visual Studio中的自動完成全部通過參數顯示完成該方法。

我已閱讀vim維基,並試過set completeopt的各種選項,沒有任何可行的選擇。

例如,set completeopt+=preview讓我選擇後的預覽窗口:

enter image description here

爲什麼讓我在預覽中的參數,它仍然無法自動完成我的代碼line 22通常是一種分心(我通常會禁用它,因爲我輸入的速度比不停地「查找」的速度快得多)。

它花了很多的配置文件的調整,以獲得下面的工作;但是,我能夠使「點」自動完成工作。因此,有某種形式的自動完成的工作的:

vim and vim-go autocompletion with dot

但同樣,它不填入參數,一旦我選擇一個功能,這是非常惱人必須鍵入ESC + back arrow + back arrow + : + GoDoc只是爲了看看它是什麼:這是10個字符筆畫,看看它是什麼。

當然,原子,崇高和VS是更漂亮時,「點自動填充」:

atom and go-plus dot autocompletion

(它也更好地類型排序的,但我確實有vim的設置要記得上次使用在頂部,這有助於)。但我不關心漂亮 - 我只是希望我的參數在用'點'選擇時顯示出來。

任何有關如何調整vim-go和相關插件的建議都會非常受歡迎,因爲我寧願在Vim中使用任何IDE。謝謝。

編輯:

我看到the author of vim-go對參數完成部分工作,並得到了它的工作:

autocompletion with parameters in vim-go

雖然,我似乎無法得到它的工作我的安裝(仍在調試它),我想向其他人展示確實可以通過填充參數來實現自動完成。

+0

1的Vim是一個文本編輯器,而不是一個IDE。如果您需要/需要IDE功能,請使用IDE。 2. Vim只做*手動*完成,而不是*自動*完成。 – romainl

+0

2017年秋季,仍然是故事的寓意是停止嘗試讓vim像IDE一樣工作。 Vim是一個很棒的文本編輯器,但是很遺憾我們需要IDE來高效地工作。在經過THAT STEEP學習曲線並嘗試了幾十個插件之後,會得到一個Vim,它會突出顯示包含幾百個LOC的文件(閱讀:真實生活代碼)。完成和intellisense似乎只能在精心策劃的演示中工作:( – Ejaz

回答

0

我不確定它是否支持完全自動完成,但supertab是一個非常強大的IDE風格完成插件。

+1

是的,我有Supertab配置爲在此問題之前觸發Omni,但這並不是問題的答案。 – eduncan911

0

Omnicomplete在INSERT模式下可以觸發A-Za-z擊鍵嗎?

您可以收聽InsertCharPre事件並檢查按下了哪些按鍵。

function! OpenCompletion() 
    if !pumvisible() && ((v:char >= 'a' && v:char <= 'z') || (v:char >= 'A' && v:char <= 'Z')) 
     call feedkeys("\<C-x>\<C-o>", "n") 
    endif 
endfunction 

autocmd InsertCharPre * call OpenCompletion() 

你也應該set completeopt+=menuone,noselect,noinsert避免vim自動插入完成文本。但請記住這不是一個普通的決定,你可能會遇到一些問題。我找到的那個是打破cgn命令。

如需進一步閱讀,請聯繫help InsertCharPre,help autocmd-events,help pumvisible(),help feedkeys()

如何獲取Omnicomplete插入func的參數?

我使用了一些年的崇高,它代表了內置函數(默認vim omnicompletion)與片段。所以,如果你想參數被插入到緩衝區,你需要:

  1. 安裝片斷經理像ultisnipsneosnippetminisnipxptemplateothers
  2. 創建一堆片段或從某處安裝。
  3. 使您的完成系統識別首選片段管理器(許多完成管理器識別ultisnips)。

如果你改變主意在使用所謂的預覽你上面這裏提到窗口的方式有一些提示:

  1. 有可能在屏幕set splitbelow的底部顯示預覽窗口。
  2. 您可以通過set previewheight選項更改其大小。
  3. 完成後自動關閉窗口完成autocmd CompleteDone * pclose

進一步的閱讀做help ins-completionhelp preview-window