diff --git a/autoload/youcompleteme.vim b/autoload/youcompleteme.vim index 8836b275..20902939 100644 --- a/autoload/youcompleteme.vim +++ b/autoload/youcompleteme.vim @@ -22,6 +22,7 @@ set cpo&vim " This needs to be called outside of a function let s:script_folder_path = escape( expand( ':p:h' ), '\' ) let s:omnifunc_mode = 0 +let s:defer_omnifunc = 1 let s:old_cursor_position = [] let s:cursor_moved = 0 @@ -88,6 +89,21 @@ function! youcompleteme#Enable() autocmd CompleteDone * call s:OnCompleteDone() augroup END + " Setting the omnifunc require us to ask the server if it has a Native + " Semantic Completer for the current buffer's filetype. When vim first start + " this mean that we have to wait for the server to be up and running which + " would block vim's GUI. To avoid this we defer setting the omnifunc the + " first time to when we enter Insert mode and then update it on every + " BufferVisit as normal. + if s:defer_omnifunc + augroup ycm_defer_omnifunc + autocmd! + autocmd InsertEnter * call s:SetOmnicompleteFunc() + \ | let s:defer_omnifunc = 0 + \ | autocmd! ycm_defer_omnifunc + augroup END + endif + " Calling these once solves the problem of BufReadPre/BufRead/BufEnter not " triggering for the first loaded file. This should be the last commands " executed in this function! @@ -412,6 +428,11 @@ function! s:OnBufferVisit() call s:SetUpCompleteopt() call s:SetCompleteFunc() + + if !s:defer_omnifunc + call s:SetOmnicompleteFunc() + endif + py ycm_state.OnBufferVisit() call s:OnFileReadyToParse() endfunction @@ -544,11 +565,6 @@ function! s:OnInsertEnter() return endif - if !get( b:, 'ycm_omnicomplete', 0 ) - let b:ycm_omnicomplete = 1 - call s:SetOmnicompleteFunc() - endif - let s:old_cursor_position = [] endfunction