diff options
Diffstat (limited to 'vim/bundle/YouCompleteMe/autoload/youcompleteme.vim')
m--------- | vim/bundle/YouCompleteMe | 0 | ||||
-rw-r--r-- | vim/bundle/YouCompleteMe/autoload/youcompleteme.vim | 889 |
2 files changed, 0 insertions, 889 deletions
diff --git a/vim/bundle/YouCompleteMe b/vim/bundle/YouCompleteMe new file mode 160000 +Subproject 0de1c0c9bb13ce82172b472c676035cd47cf6a6 diff --git a/vim/bundle/YouCompleteMe/autoload/youcompleteme.vim b/vim/bundle/YouCompleteMe/autoload/youcompleteme.vim deleted file mode 100644 index 37ed572..0000000 --- a/vim/bundle/YouCompleteMe/autoload/youcompleteme.vim +++ /dev/null @@ -1,889 +0,0 @@ -" Copyright (C) 2011, 2012 Google Inc. -" -" This file is part of YouCompleteMe. -" -" YouCompleteMe is free software: you can redistribute it and/or modify -" it under the terms of the GNU General Public License as published by -" the Free Software Foundation, either version 3 of the License, or -" (at your option) any later version. -" -" YouCompleteMe is distributed in the hope that it will be useful, -" but WITHOUT ANY WARRANTY; without even the implied warranty of -" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -" GNU General Public License for more details. -" -" You should have received a copy of the GNU General Public License -" along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -" This is basic vim plugin boilerplate -let s:save_cpo = &cpo -set cpo&vim - -" This needs to be called outside of a function -let s:script_folder_path = escape( expand( '<sfile>:p:h' ), '\' ) -let s:omnifunc_mode = 0 -let s:defer_omnifunc = 1 - -let s:old_cursor_position = [] -let s:cursor_moved = 0 -let s:moved_vertically_in_insert_mode = 0 -let s:previous_num_chars_on_current_line = strlen( getline('.') ) - - -function! s:UsingPython2() - " I'm willing to bet quite a bit that sooner or later, somebody will ask us to - " make it configurable which version of Python we use. - if has('python') - return 1 - endif - return 0 -endfunction - - -let s:using_python2 = s:UsingPython2() -let s:python_until_eof = s:using_python2 ? "python << EOF" : "python3 << EOF" -let s:python_command = s:using_python2 ? "py " : "py3 " - - -function! s:Pyeval( eval_string ) - if s:using_python2 - return pyeval( a:eval_string ) - endif - return py3eval( a:eval_string ) -endfunction - - -function! youcompleteme#Enable() - call s:SetUpBackwardsCompatibility() - - " This can be 0 if YCM libs are old or -1 if an exception occured while - " executing the function. - if s:SetUpPython() != 1 - return - endif - - call s:SetUpCommands() - call s:SetUpCpoptions() - call s:SetUpCompleteopt() - call s:SetUpKeyMappings() - - if g:ycm_show_diagnostics_ui - call s:TurnOffSyntasticForCFamily() - endif - - call s:SetUpSigns() - call s:SetUpSyntaxHighlighting() - - if g:ycm_allow_changing_updatetime && &updatetime > 2000 - set ut=2000 - endif - - call youcompleteme#EnableCursorMovedAutocommands() - augroup youcompleteme - autocmd! - " Note that these events will NOT trigger for the file vim is started with; - " so if you do "vim foo.cc", these events will not trigger when that buffer - " is read. This is because youcompleteme#Enable() is called on VimEnter and - " that happens *after" BufRead/BufEnter has already triggered for the - " initial file. - " We also need to trigger buf init code on the FileType event because when - " the user does :enew and then :set ft=something, we need to run buf init - " code again. - autocmd BufReadPre * call s:OnBufferReadPre( expand( '<afile>:p' ) ) - autocmd BufRead,BufEnter,FileType * call s:OnBufferVisit() - autocmd BufUnload * call s:OnBufferUnload( expand( '<afile>:p' ) ) - autocmd CursorHold,CursorHoldI * call s:OnCursorHold() - autocmd InsertLeave * call s:OnInsertLeave() - autocmd InsertEnter * call s:OnInsertEnter() - autocmd VimLeave * call s:OnVimLeave() - 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! - call s:OnBufferReadPre( expand( '<afile>:p' ) ) - call s:OnBufferVisit() -endfunction - - -function! youcompleteme#EnableCursorMovedAutocommands() - augroup ycmcompletemecursormove - autocmd! - autocmd CursorMovedI * call s:OnCursorMovedInsertMode() - autocmd CursorMoved * call s:OnCursorMovedNormalMode() - augroup END -endfunction - - -function! youcompleteme#DisableCursorMovedAutocommands() - autocmd! ycmcompletemecursormove CursorMoved * - autocmd! ycmcompletemecursormove CursorMovedI * -endfunction - - -function! youcompleteme#GetErrorCount() - return s:Pyeval( 'ycm_state.GetErrorCount()' ) -endfunction - - -function! youcompleteme#GetWarningCount() - return s:Pyeval( 'ycm_state.GetWarningCount()' ) -endfunction - - -function! s:SetUpPython() abort - exec s:python_until_eof -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import - -import os -import sys -import traceback -import vim - -# Add python sources folder to the system path. -script_folder = vim.eval( 's:script_folder_path' ) -sys.path.insert( 0, os.path.join( script_folder, '..', 'python' ) ) - -from ycm.setup import SetUpSystemPaths, SetUpYCM - -# We enclose this code in a try/except block to avoid backtraces in Vim. -try: - SetUpSystemPaths() - - # Import the modules used in this file. - from ycm import base, vimsupport - - ycm_state = SetUpYCM() -except Exception as error: - # We don't use PostVimMessage or EchoText from the vimsupport module because - # importing this module may fail. - vim.command( 'redraw | echohl WarningMsg' ) - for line in traceback.format_exc().splitlines(): - vim.command( "echom '{0}'".format( line.replace( "'", "''" ) ) ) - - vim.command( "echo 'YouCompleteMe unavailable: {0}'" - .format( str( error ).replace( "'", "''" ) ) ) - vim.command( 'echohl None' ) - vim.command( 'return 0' ) -else: - vim.command( 'return 1' ) -EOF -endfunction - - -function! s:SetUpKeyMappings() - " The g:ycm_key_select_completion and g:ycm_key_previous_completion used to - " exist and are now here purely for the sake of backwards compatibility; we - " don't want to break users if we can avoid it. - - if exists('g:ycm_key_select_completion') && - \ index(g:ycm_key_list_select_completion, - \ g:ycm_key_select_completion) == -1 - call add(g:ycm_key_list_select_completion, g:ycm_key_select_completion) - endif - - if exists('g:ycm_key_previous_completion') && - \ index(g:ycm_key_list_previous_completion, - \ g:ycm_key_previous_completion) == -1 - call add(g:ycm_key_list_previous_completion, g:ycm_key_previous_completion) - endif - - for key in g:ycm_key_list_select_completion - " With this command, when the completion window is visible, the tab key - " (default) will select the next candidate in the window. In vim, this also - " changes the typed-in text to that of the candidate completion. - exe 'inoremap <expr>' . key . - \ ' pumvisible() ? "\<C-n>" : "\' . key .'"' - endfor - - - for key in g:ycm_key_list_previous_completion - " This selects the previous candidate for shift-tab (default) - exe 'inoremap <expr>' . key . - \ ' pumvisible() ? "\<C-p>" : "\' . key .'"' - endfor - - if !empty( g:ycm_key_invoke_completion ) - let invoke_key = g:ycm_key_invoke_completion - - " Inside the console, <C-Space> is passed as <Nul> to Vim - if invoke_key ==# '<C-Space>' - imap <Nul> <C-Space> - endif - - " <c-x><c-o> trigger omni completion, <c-p> deselects the first completion - " candidate that vim selects by default - silent! exe 'inoremap <unique> ' . invoke_key . ' <C-X><C-O><C-P>' - endif - - if !empty( g:ycm_key_detailed_diagnostics ) - silent! exe 'nnoremap <unique> ' . g:ycm_key_detailed_diagnostics . - \ ' :YcmShowDetailedDiagnostic<cr>' - endif -endfunction - - -function! s:SetUpSigns() - " We try to ensure backwards compatibility with Syntastic if the user has - " already defined styling for Syntastic highlight groups. - - if !hlexists( 'YcmErrorSign' ) - if hlexists( 'SyntasticErrorSign') - highlight link YcmErrorSign SyntasticErrorSign - else - highlight link YcmErrorSign error - endif - endif - - if !hlexists( 'YcmWarningSign' ) - if hlexists( 'SyntasticWarningSign') - highlight link YcmWarningSign SyntasticWarningSign - else - highlight link YcmWarningSign todo - endif - endif - - if !hlexists( 'YcmErrorLine' ) - highlight link YcmErrorLine SyntasticErrorLine - endif - - if !hlexists( 'YcmWarningLine' ) - highlight link YcmWarningLine SyntasticWarningLine - endif - - exe 'sign define YcmError text=' . g:ycm_error_symbol . - \ ' texthl=YcmErrorSign linehl=YcmErrorLine' - exe 'sign define YcmWarning text=' . g:ycm_warning_symbol . - \ ' texthl=YcmWarningSign linehl=YcmWarningLine' -endfunction - - -function! s:SetUpSyntaxHighlighting() - " We try to ensure backwards compatibility with Syntastic if the user has - " already defined styling for Syntastic highlight groups. - - if !hlexists( 'YcmErrorSection' ) - if hlexists( 'SyntasticError' ) - highlight link YcmErrorSection SyntasticError - else - highlight link YcmErrorSection SpellBad - endif - endif - - if !hlexists( 'YcmWarningSection' ) - if hlexists( 'SyntasticWarning' ) - highlight link YcmWarningSection SyntasticWarning - else - highlight link YcmWarningSection SpellCap - endif - endif -endfunction - - -function! s:SetUpBackwardsCompatibility() - let complete_in_comments_and_strings = - \ get( g:, 'ycm_complete_in_comments_and_strings', 0 ) - - if complete_in_comments_and_strings - let g:ycm_complete_in_strings = 1 - let g:ycm_complete_in_comments = 1 - endif - - " ycm_filetypes_to_completely_ignore is the old name for fileype_blacklist - if has_key( g:, 'ycm_filetypes_to_completely_ignore' ) - let g:filetype_blacklist = g:ycm_filetypes_to_completely_ignore - endif -endfunction - - -" Needed so that YCM is used instead of Syntastic -function! s:TurnOffSyntasticForCFamily() - let g:syntastic_cpp_checkers = [] - let g:syntastic_c_checkers = [] - let g:syntastic_objc_checkers = [] - let g:syntastic_objcpp_checkers = [] -endfunction - - -function! s:AllowedToCompleteInCurrentFile() - if empty( &filetype ) || - \ getbufvar( winbufnr( winnr() ), "&buftype" ) ==# 'nofile' || - \ &filetype ==# 'qf' - return 0 - endif - - if exists( 'b:ycm_largefile' ) - return 0 - endif - - let whitelist_allows = has_key( g:ycm_filetype_whitelist, '*' ) || - \ has_key( g:ycm_filetype_whitelist, &filetype ) - let blacklist_allows = !has_key( g:ycm_filetype_blacklist, &filetype ) - - return whitelist_allows && blacklist_allows -endfunction - - -function! s:SetUpCommands() - command! YcmRestartServer call s:RestartServer() - command! YcmShowDetailedDiagnostic call s:ShowDetailedDiagnostic() - command! YcmDebugInfo call s:DebugInfo() - command! -nargs=? -complete=custom,youcompleteme#LogsComplete - \ YcmToggleLogs call s:ToggleLogs(<f-args>) - command! -nargs=* -complete=custom,youcompleteme#SubCommandsComplete - \ YcmCompleter call s:CompleterCommand(<f-args>) - command! YcmForceCompileAndDiagnostics call s:ForceCompileAndDiagnostics() - command! YcmDiags call s:ShowDiagnostics() -endfunction - - -function! s:SetUpCpoptions() - " Without this flag in cpoptions, critical YCM mappings do not work. There's - " no way to not have this and have YCM working, so force the flag. - set cpoptions+=B - - " This prevents the display of "Pattern not found" & similar messages during - " completion. This is only available since Vim 7.4.314 - if s:Pyeval( 'vimsupport.VimVersionAtLeast("7.4.314")' ) - set shortmess+=c - endif -endfunction - - -function! s:SetUpCompleteopt() - " Some plugins (I'm looking at you, vim-notes) change completeopt by for - " instance adding 'longest'. This breaks YCM. So we force our settings. - " There's no two ways about this: if you want to use YCM then you have to - " have these completeopt settings, otherwise YCM won't work at all. - - " We need menuone in completeopt, otherwise when there's only one candidate - " for completion, the menu doesn't show up. - set completeopt-=menu - set completeopt+=menuone - - " This is unnecessary with our features. People use this option to insert - " the common prefix of all the matches and then add more differentiating chars - " so that they can select a more specific match. With our features, they - " don't need to insert the prefix; they just type the differentiating chars. - " Also, having this option set breaks the plugin. - set completeopt-=longest - - if g:ycm_add_preview_to_completeopt - set completeopt+=preview - endif -endfunction - - -" For various functions/use-cases, we want to keep track of whether the buffer -" has changed since the last time they were invoked. We keep the state of -" b:changedtick of the last time the specific function was called in -" b:ycm_changedtick. -function! s:SetUpYcmChangedTick() - let b:ycm_changedtick = - \ get( b:, 'ycm_changedtick', { - \ 'file_ready_to_parse' : -1, - \ } ) -endfunction - - -function! s:OnVimLeave() - exec s:python_command "ycm_state.OnVimLeave()" -endfunction - - -function! s:OnCompleteDone() - exec s:python_command "ycm_state.OnCompleteDone()" -endfunction - - -function! s:OnBufferReadPre(filename) - let threshold = g:ycm_disable_for_files_larger_than_kb * 1024 - - if threshold > 0 && getfsize( a:filename ) > threshold - echohl WarningMsg | - \ echomsg "YouCompleteMe is disabled in this buffer; " . - \ "the file exceeded the max size (see YCM options)." | - \ echohl None - let b:ycm_largefile = 1 - endif -endfunction - -function! s:OnBufferVisit() - " We need to do this even when we are not allowed to complete in the current - " file because we might be allowed to complete in the future! The canonical - " example is creating a new buffer with :enew and then setting a filetype. - call s:SetUpYcmChangedTick() - - if !s:AllowedToCompleteInCurrentFile() - return - endif - - call s:SetUpCompleteopt() - call s:SetCompleteFunc() - - if !s:defer_omnifunc - call s:SetOmnicompleteFunc() - endif - - exec s:python_command "ycm_state.OnBufferVisit()" - call s:OnFileReadyToParse() -endfunction - - -function! s:OnBufferUnload( deleted_buffer_file ) - if !s:AllowedToCompleteInCurrentFile() || empty( a:deleted_buffer_file ) - return - endif - - exec s:python_command "ycm_state.OnBufferUnload(" - \ "vim.eval( 'a:deleted_buffer_file' ) )" -endfunction - - -function! s:OnCursorHold() - if !s:AllowedToCompleteInCurrentFile() - return - endif - - call s:SetUpCompleteopt() - call s:OnFileReadyToParse() -endfunction - - -function! s:OnFileReadyToParse() - " We need to call this just in case there is no b:ycm_changetick; this can - " happen for special buffers. - call s:SetUpYcmChangedTick() - - " Order is important here; we need to extract any information before - " reparsing the file again. If we sent the new parse request first, then - " the response would always be pending when we called - " HandleFileParseRequest. - exec s:python_command "ycm_state.HandleFileParseRequest()" - - let buffer_changed = b:changedtick != b:ycm_changedtick.file_ready_to_parse - if buffer_changed - exec s:python_command "ycm_state.OnFileReadyToParse()" - endif - let b:ycm_changedtick.file_ready_to_parse = b:changedtick -endfunction - - -function! s:SetCompleteFunc() - let &completefunc = 'youcompleteme#Complete' - let &l:completefunc = 'youcompleteme#Complete' -endfunction - - -function! s:SetOmnicompleteFunc() - if s:Pyeval( 'ycm_state.NativeFiletypeCompletionUsable()' ) - let &omnifunc = 'youcompleteme#OmniComplete' - let &l:omnifunc = 'youcompleteme#OmniComplete' - - " If we don't have native filetype support but the omnifunc is set to YCM's - " omnifunc because the previous file the user was editing DID have native - " support, we remove our omnifunc. - elseif &omnifunc == 'youcompleteme#OmniComplete' - let &omnifunc = '' - let &l:omnifunc = '' - endif -endfunction - -function! s:OnCursorMovedInsertMode() - if !s:AllowedToCompleteInCurrentFile() - return - endif - - exec s:python_command "ycm_state.OnCursorMoved()" - call s:UpdateCursorMoved() - - " Basically, we need to only trigger the completion menu when the user has - " inserted or deleted a character, NOT just when the user moves in insert mode - " (with, say, the arrow keys). If we trigger the menu even on pure moves, then - " it's impossible to move in insert mode since the up/down arrows start moving - " the selected completion in the completion menu. Yeah, people shouldn't be - " moving in insert mode at all (that's what normal mode is for) but explain - " that to the users who complain... - if !s:BufferTextChangedSinceLastMoveInInsertMode() - return - endif - - call s:IdentifierFinishedOperations() - if g:ycm_autoclose_preview_window_after_completion - call s:ClosePreviewWindowIfNeeded() - endif - - if g:ycm_auto_trigger || s:omnifunc_mode - call s:InvokeCompletion() - endif - - " We have to make sure we correctly leave omnifunc mode even when the user - " inserts something like a "operator[]" candidate string which fails - " CurrentIdentifierFinished check. - if s:omnifunc_mode && !s:Pyeval( 'base.LastEnteredCharIsIdentifierChar()') - let s:omnifunc_mode = 0 - endif -endfunction - - -function! s:OnCursorMovedNormalMode() - if !s:AllowedToCompleteInCurrentFile() - return - endif - - call s:OnFileReadyToParse() - exec s:python_command "ycm_state.OnCursorMoved()" -endfunction - - -function! s:OnInsertLeave() - if !s:AllowedToCompleteInCurrentFile() - return - endif - - let s:omnifunc_mode = 0 - call s:OnFileReadyToParse() - exec s:python_command "ycm_state.OnInsertLeave()" - if g:ycm_autoclose_preview_window_after_completion || - \ g:ycm_autoclose_preview_window_after_insertion - call s:ClosePreviewWindowIfNeeded() - endif -endfunction - - -function! s:OnInsertEnter() - let s:previous_num_chars_on_current_line = strlen( getline('.') ) - - if !s:AllowedToCompleteInCurrentFile() - return - endif - - let s:old_cursor_position = [] -endfunction - - -function! s:UpdateCursorMoved() - let current_position = getpos('.') - let s:cursor_moved = current_position != s:old_cursor_position - - let s:moved_vertically_in_insert_mode = s:old_cursor_position != [] && - \ current_position[ 1 ] != s:old_cursor_position[ 1 ] - - let s:old_cursor_position = current_position -endfunction - - -function! s:BufferTextChangedSinceLastMoveInInsertMode() - let num_chars_in_current_cursor_line = strlen( getline('.') ) - - if s:moved_vertically_in_insert_mode - let s:previous_num_chars_on_current_line = num_chars_in_current_cursor_line - return 0 - endif - - let changed_text_on_current_line = num_chars_in_current_cursor_line != - \ s:previous_num_chars_on_current_line - let s:previous_num_chars_on_current_line = num_chars_in_current_cursor_line - - return changed_text_on_current_line -endfunction - - -function! s:ClosePreviewWindowIfNeeded() - let current_buffer_name = bufname('') - - " We don't want to try to close the preview window in special buffers like - " "[Command Line]"; if we do, Vim goes bonkers. Special buffers always start - " with '['. - if current_buffer_name[ 0 ] == '[' - return - endif - - " This command does the actual closing of the preview window. If no preview - " window is shown, nothing happens. - pclose -endfunction - - -function! s:IdentifierFinishedOperations() - if !s:Pyeval( 'base.CurrentIdentifierFinished()' ) - return - endif - exec s:python_command "ycm_state.OnCurrentIdentifierFinished()" - let s:omnifunc_mode = 0 -endfunction - - -" Returns 1 when inside comment and 2 when inside string -function! s:InsideCommentOrString() - " Has to be col('.') -1 because col('.') doesn't exist at this point. We are - " in insert mode when this func is called. - let syntax_group = synIDattr( - \ synIDtrans( synID( line( '.' ), col( '.' ) - 1, 1 ) ), 'name') - - if stridx(syntax_group, 'Comment') > -1 - return 1 - endif - - if stridx(syntax_group, 'String') > -1 - return 2 - endif - - return 0 -endfunction - - -function! s:InsideCommentOrStringAndShouldStop() - let retval = s:InsideCommentOrString() - let inside_comment = retval == 1 - let inside_string = retval == 2 - - if inside_comment && g:ycm_complete_in_comments || - \ inside_string && g:ycm_complete_in_strings - return 0 - endif - - return retval -endfunction - - -function! s:OnBlankLine() - return s:Pyeval( 'not vim.current.line or vim.current.line.isspace()' ) -endfunction - - -function! s:InvokeCompletion() - if &completefunc != "youcompleteme#Complete" - return - endif - - if s:InsideCommentOrStringAndShouldStop() || s:OnBlankLine() - return - endif - - " This is tricky. First, having 'refresh' set to 'always' in the dictionary - " that our completion function returns makes sure that our completion function - " is called on every keystroke. Second, when the sequence of characters the - " user typed produces no results in our search an infinite loop can occur. The - " problem is that our feedkeys call triggers the OnCursorMovedI event which we - " are tied to. We prevent this infinite loop from starting by making sure that - " the user has moved the cursor since the last time we provided completion - " results. - if !s:cursor_moved - return - endif - - " <c-x><c-u> invokes the user's completion function (which we have set to - " youcompleteme#Complete), and <c-p> tells Vim to select the previous - " completion candidate. This is necessary because by default, Vim selects the - " first candidate when completion is invoked, and selecting a candidate - " automatically replaces the current text with it. Calling <c-p> forces Vim to - " deselect the first candidate and in turn preserve the user's current text - " until he explicitly chooses to replace it with a completion. - call feedkeys( "\<C-X>\<C-U>\<C-P>", 'n' ) -endfunction - - -exec s:python_until_eof -def GetCompletionsInner(): - request = ycm_state.GetCurrentCompletionRequest() - request.Start() - while not request.Done(): - if bool( int( vim.eval( 'complete_check()' ) ) ): - return { 'words' : [], 'refresh' : 'always'} - - results = base.AdjustCandidateInsertionText( request.Response() ) - return { 'words' : results, 'refresh' : 'always' } -EOF - - -function! s:GetCompletions() - exec s:python_command "results = GetCompletionsInner()" - let results = s:Pyeval( 'results' ) - return results -endfunction - - -" This is our main entry point. This is what vim calls to get completions. -function! youcompleteme#Complete( findstart, base ) - " After the user types one character after the call to the omnifunc, the - " completefunc will be called because of our mapping that calls the - " completefunc on every keystroke. Therefore we need to delegate the call we - " 'stole' back to the omnifunc - if s:omnifunc_mode - return youcompleteme#OmniComplete( a:findstart, a:base ) - endif - - if a:findstart - " InvokeCompletion has this check but we also need it here because of random - " Vim bugs and unfortunate interactions with the autocommands of other - " plugins - if !s:cursor_moved - " for vim, -2 means not found but don't trigger an error message - " see :h complete-functions - return -2 - endif - - if !s:Pyeval( 'ycm_state.IsServerAlive()' ) - return -2 - endif - exec s:python_command "ycm_state.CreateCompletionRequest()" - return s:Pyeval( 'base.CompletionStartColumn()' ) - else - return s:GetCompletions() - endif -endfunction - - -function! youcompleteme#OmniComplete( findstart, base ) - if a:findstart - if !s:Pyeval( 'ycm_state.IsServerAlive()' ) - return -2 - endif - let s:omnifunc_mode = 1 - exec s:python_command "ycm_state.CreateCompletionRequest(" - \ "force_semantic = True )" - return s:Pyeval( 'base.CompletionStartColumn()' ) - else - return s:GetCompletions() - endif -endfunction - - -function! youcompleteme#ServerPid() - return s:Pyeval( 'ycm_state.ServerPid()' ) -endfunction - - -function! s:RestartServer() - exec s:python_command "ycm_state.RestartServer()" -endfunction - - -function! s:ShowDetailedDiagnostic() - exec s:python_command "ycm_state.ShowDetailedDiagnostic()" -endfunction - - -function! s:DebugInfo() - echom "Printing YouCompleteMe debug information..." - let debug_info = s:Pyeval( 'ycm_state.DebugInfo()' ) - for line in split( debug_info, "\n" ) - echom '-- ' . line - endfor -endfunction - - -function! s:ToggleLogs(...) - let stderr = a:0 == 0 || a:1 !=? 'stdout' - let stdout = a:0 == 0 || a:1 !=? 'stderr' - exec s:python_command "ycm_state.ToggleLogs(" - \ "stdout = vimsupport.GetBoolValue( 'l:stdout' )," - \ "stderr = vimsupport.GetBoolValue( 'l:stderr' ) )" -endfunction - - -function! s:CompleterCommand(...) - " CompleterCommand will call the OnUserCommand function of a completer. - " If the first arguments is of the form "ft=..." it can be used to specify the - " completer to use (for example "ft=cpp"). Else the native filetype completer - " of the current buffer is used. If no native filetype completer is found and - " no completer was specified this throws an error. You can use - " "ft=ycm:ident" to select the identifier completer. - " The remaining arguments will be passed to the completer. - let arguments = copy(a:000) - let completer = '' - - if a:0 > 0 && strpart(a:1, 0, 3) == 'ft=' - if a:1 == 'ft=ycm:ident' - let completer = 'identifier' - endif - let arguments = arguments[1:] - endif - - exec s:python_command "ycm_state.SendCommandRequest(" - \ "vim.eval( 'l:arguments' ), vim.eval( 'l:completer' ) ) " -endfunction - - -function! youcompleteme#OpenGoToList() - exec s:python_command "vimsupport.PostVimMessage(" - \ "'WARNING: youcompleteme#OpenGoToList function is deprecated." - \ "Do NOT use it.')" - exec s:python_command "vimsupport.OpenQuickFixList( True, True )" -endfunction - - -function! youcompleteme#LogsComplete( arglead, cmdline, cursorpos ) - return "stdout\nstderr" -endfunction - - -function! youcompleteme#SubCommandsComplete( arglead, cmdline, cursorpos ) - return join( s:Pyeval( 'ycm_state.GetDefinedSubcommands()' ), - \ "\n") -endfunction - - -function! s:ForceCompile() - if !s:Pyeval( 'ycm_state.NativeFiletypeCompletionUsable()' ) - echom "Native filetype completion not supported for current file, " - \ . "cannot force recompilation." - return 0 - endif - - echom "Forcing compilation, this will block Vim until done." - exec s:python_command "ycm_state.OnFileReadyToParse()" - exec s:python_command "ycm_state.HandleFileParseRequest( True )" - - return 1 -endfunction - - -function! s:ForceCompileAndDiagnostics() - let compilation_succeeded = s:ForceCompile() - if !compilation_succeeded - return - endif - echom "Diagnostics refreshed." -endfunction - - -function! s:ShowDiagnostics() - let compilation_succeeded = s:ForceCompile() - if !compilation_succeeded - return - endif - - if s:Pyeval( 'ycm_state.PopulateLocationListWithLatestDiagnostics()' ) - if g:ycm_open_loclist_on_ycm_diags - lopen - endif - else - echom "No warnings or errors detected" - endif -endfunction - - -" This is basic vim plugin boilerplate -let &cpo = s:save_cpo -unlet s:save_cpo |