Implement completer-specific commands
This provides a framework for completer-writers to create completer-specific commands. I have in mind to use this for the clang completer to force reloading of a flags module via `:YcmCompleter reload`.
This commit is contained in:
parent
eb7bec4fdd
commit
3d305f9c74
@ -446,6 +446,15 @@ This will print out various debug information for the current file. Useful to
|
|||||||
see what compile commands will be used for the file if you're using the semantic
|
see what compile commands will be used for the file if you're using the semantic
|
||||||
completion engine.
|
completion engine.
|
||||||
|
|
||||||
|
### The `YcmCompleter` command
|
||||||
|
|
||||||
|
This command can be used to invoke completer-specific commands. If the first
|
||||||
|
argument is of the form `ft=...` the completer for that file type will be used
|
||||||
|
(for example `ft=cpp`), else the native completer of the current buffer will be
|
||||||
|
used.
|
||||||
|
Call `YcmCompleter` without further arguments for information about the
|
||||||
|
commands you can call for the selected completer.
|
||||||
|
|
||||||
Options
|
Options
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
@ -484,6 +484,40 @@ endfunction
|
|||||||
|
|
||||||
command! YcmDebugInfo call s:DebugInfo()
|
command! YcmDebugInfo call s:DebugInfo()
|
||||||
|
|
||||||
|
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:omni"
|
||||||
|
" to select the omni completer or "ft=ycm:ident" to select the identifier
|
||||||
|
" completer. The remaining arguments will passed to the completer.
|
||||||
|
let arguments = copy(a:000)
|
||||||
|
|
||||||
|
if a:0 > 0 && strpart(a:1, 0, 3) == 'ft='
|
||||||
|
if a:1 == 'ft=ycm:omni'
|
||||||
|
py completer = ycm_state.GetOmniCompleter()
|
||||||
|
elseif a:1 == 'ft=ycm:ident'
|
||||||
|
py completer = ycm_state.GetIdentifierCompleter()
|
||||||
|
else
|
||||||
|
py completer = ycm_state.GetFiletypeCompleterForFiletype(
|
||||||
|
\ vim.eval('a:1').lstrip('ft=') )
|
||||||
|
endif
|
||||||
|
let arguments = arguments[1:]
|
||||||
|
elseif pyeval( 'ycm_state.NativeFiletypeCompletionAvailable()' )
|
||||||
|
py completer = ycm_state.GetFiletypeCompleter()
|
||||||
|
else
|
||||||
|
echohl WarningMsg |
|
||||||
|
\ echomsg "No native completer found for current buffer." |
|
||||||
|
\ echomsg "Use ft=... as the first argument to specify a completer." |
|
||||||
|
\ echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
py completer.OnUserCommand( vim.eval( 'l:arguments' ) )
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command! -nargs=* YcmCompleter call s:CompleterCommand(<f-args>)
|
||||||
|
|
||||||
function! s:ForceCompile()
|
function! s:ForceCompile()
|
||||||
if !pyeval( 'ycm_state.NativeFiletypeCompletionUsable()' )
|
if !pyeval( 'ycm_state.NativeFiletypeCompletionUsable()' )
|
||||||
|
@ -23,6 +23,7 @@ import vimsupport
|
|||||||
import ycm_core
|
import ycm_core
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
|
NO_USER_COMMANDS = 'This completer does not define any commands.'
|
||||||
|
|
||||||
class Completer( object ):
|
class Completer( object ):
|
||||||
"""A base class for all Completers in YCM.
|
"""A base class for all Completers in YCM.
|
||||||
@ -96,7 +97,15 @@ class Completer( object ):
|
|||||||
their specific events occur. For instance, the identifier completer collects
|
their specific events occur. For instance, the identifier completer collects
|
||||||
all the identifiers in the file in OnFileReadyToParse() which gets called when
|
all the identifiers in the file in OnFileReadyToParse() which gets called when
|
||||||
the user stops typing for 2 seconds (Vim's CursorHold and CursorHoldI events).
|
the user stops typing for 2 seconds (Vim's CursorHold and CursorHoldI events).
|
||||||
"""
|
|
||||||
|
One special function is OnUserCommand. It is called when the user uses the
|
||||||
|
command :YcmCompleter and is passed all extra arguments used on command
|
||||||
|
invocation (e.g. OnUserCommand(['first argument', 'second'])). This can be
|
||||||
|
used for completer-specific commands such as reloading external
|
||||||
|
configuration.
|
||||||
|
When the command is called with no arguments you should print a short summary
|
||||||
|
of the supported commands or point the user to the help section where this
|
||||||
|
information can be found."""
|
||||||
|
|
||||||
__metaclass__ = abc.ABCMeta
|
__metaclass__ = abc.ABCMeta
|
||||||
|
|
||||||
@ -234,6 +243,10 @@ class Completer( object ):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def OnUserCommand( self, arguments ):
|
||||||
|
vimsupport.PostVimMessage( NO_USER_COMMANDS )
|
||||||
|
|
||||||
|
|
||||||
def OnCurrentIdentifierFinished( self ):
|
def OnCurrentIdentifierFinished( self ):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -53,6 +53,10 @@ class YouCompleteMe( object ):
|
|||||||
return self.identcomp
|
return self.identcomp
|
||||||
|
|
||||||
|
|
||||||
|
def GetOmniCompleter( self ):
|
||||||
|
return self.omnicomp
|
||||||
|
|
||||||
|
|
||||||
def GetFiletypeCompleter( self ):
|
def GetFiletypeCompleter( self ):
|
||||||
filetypes = vimsupport.CurrentFiletypes()
|
filetypes = vimsupport.CurrentFiletypes()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user