Remove user_options_store dependency
Directly define the ycmd options in the plugin.
This commit is contained in:
parent
8e33c3c644
commit
e651d970ed
@ -200,7 +200,6 @@ ycmd_third_party_folder = p.join( third_party_folder, 'ycmd', 'third_party' )
|
|||||||
dependencies = [ p.join( root_folder, 'python' ),
|
dependencies = [ p.join( root_folder, 'python' ),
|
||||||
p.join( third_party_folder, 'requests-futures' ),
|
p.join( third_party_folder, 'requests-futures' ),
|
||||||
p.join( third_party_folder, 'ycmd' ),
|
p.join( third_party_folder, 'ycmd' ),
|
||||||
p.join( ycmd_third_party_folder, 'frozendict' ),
|
|
||||||
p.join( ycmd_third_party_folder, 'requests' ) ]
|
p.join( ycmd_third_party_folder, 'requests' ) ]
|
||||||
|
|
||||||
# The concurrent.futures module is part of the standard library on Python 3.
|
# The concurrent.futures module is part of the standard library on Python 3.
|
||||||
|
@ -72,11 +72,26 @@ endif
|
|||||||
|
|
||||||
let g:loaded_youcompleteme = 1
|
let g:loaded_youcompleteme = 1
|
||||||
|
|
||||||
" NOTE: Most defaults are in third_party/ycmd/ycmd/default_settings.json. They
|
"
|
||||||
" are loaded into Vim globals with the 'ycm_' prefix if such a key does not
|
" List of YCM options.
|
||||||
" already exist; thus, the user can override the defaults.
|
"
|
||||||
" The only defaults that are here are the ones that are only relevant to the YCM
|
let g:ycm_filetype_whitelist =
|
||||||
" Vim client and not the ycmd server.
|
\ get( g:, 'ycm_filetype_whitelist', { "*": 1 } )
|
||||||
|
|
||||||
|
let g:ycm_filetype_blacklist =
|
||||||
|
\ get( g:, 'ycm_filetype_blacklist', {
|
||||||
|
\ 'tagbar': 1,
|
||||||
|
\ 'qf': 1,
|
||||||
|
\ 'notes': 1,
|
||||||
|
\ 'markdown': 1,
|
||||||
|
\ 'netrw': 1,
|
||||||
|
\ 'unite': 1,
|
||||||
|
\ 'text': 1,
|
||||||
|
\ 'vimwiki': 1,
|
||||||
|
\ 'pandoc': 1,
|
||||||
|
\ 'infolog': 1,
|
||||||
|
\ 'mail': 1
|
||||||
|
\ } )
|
||||||
|
|
||||||
let g:ycm_open_loclist_on_ycm_diags =
|
let g:ycm_open_loclist_on_ycm_diags =
|
||||||
\ get( g:, 'ycm_open_loclist_on_ycm_diags', 1 )
|
\ get( g:, 'ycm_open_loclist_on_ycm_diags', 1 )
|
||||||
@ -150,12 +165,106 @@ let g:ycm_warning_symbol =
|
|||||||
\ get( g:, 'ycm_warning_symbol',
|
\ get( g:, 'ycm_warning_symbol',
|
||||||
\ get( g:, 'syntastic_warning_symbol', '>>' ) )
|
\ get( g:, 'syntastic_warning_symbol', '>>' ) )
|
||||||
|
|
||||||
|
let g:ycm_complete_in_comments =
|
||||||
|
\ get( g:, 'ycm_complete_in_comments', 0 )
|
||||||
|
|
||||||
|
let g:ycm_complete_in_strings =
|
||||||
|
\ get( g:, 'ycm_complete_in_strings', 1 )
|
||||||
|
|
||||||
|
let g:ycm_collect_identifiers_from_tags_files =
|
||||||
|
\ get( g:, 'ycm_collect_identifiers_from_tags_files', 0 )
|
||||||
|
|
||||||
|
let g:ycm_seed_identifiers_with_syntax =
|
||||||
|
\ get( g:, 'ycm_seed_identifiers_with_syntax', 0 )
|
||||||
|
|
||||||
let g:ycm_goto_buffer_command =
|
let g:ycm_goto_buffer_command =
|
||||||
\ get( g:, 'ycm_goto_buffer_command', 'same-buffer' )
|
\ get( g:, 'ycm_goto_buffer_command', 'same-buffer' )
|
||||||
|
|
||||||
let g:ycm_disable_for_files_larger_than_kb =
|
let g:ycm_disable_for_files_larger_than_kb =
|
||||||
\ get( g:, 'ycm_disable_for_files_larger_than_kb', 1000 )
|
\ get( g:, 'ycm_disable_for_files_larger_than_kb', 1000 )
|
||||||
|
|
||||||
|
"
|
||||||
|
" List of ycmd options.
|
||||||
|
"
|
||||||
|
let g:ycm_filepath_completion_use_working_dir =
|
||||||
|
\ get( g:, 'ycm_filepath_completion_use_working_dir', 0 )
|
||||||
|
|
||||||
|
let g:ycm_auto_trigger =
|
||||||
|
\ get( g:, 'ycm_auto_trigger', 1 )
|
||||||
|
|
||||||
|
let g:ycm_min_num_of_chars_for_completion =
|
||||||
|
\ get( g:, 'ycm_min_num_of_chars_for_completion', 2 )
|
||||||
|
|
||||||
|
let g:ycm_min_identifier_candidate_chars =
|
||||||
|
\ get( g:, 'ycm_min_num_identifier_candidate_chars', 0 )
|
||||||
|
|
||||||
|
let g:ycm_semantic_triggers =
|
||||||
|
\ get( g:, 'ycm_semantic_triggers', {} )
|
||||||
|
|
||||||
|
let g:ycm_filetype_specific_completion_to_disable =
|
||||||
|
\ get( g:, 'ycm_filetype_specific_completion_to_disable',
|
||||||
|
\ { 'gitcommit': 1 } )
|
||||||
|
|
||||||
|
let g:ycm_collect_identifiers_from_comments_and_strings =
|
||||||
|
\ get( g:, 'ycm_collect_identifiers_from_comments_and_strings', 0 )
|
||||||
|
|
||||||
|
let g:ycm_max_num_identifier_candidates =
|
||||||
|
\ get( g:, 'ycm_max_num_identifier_candidates', 10 )
|
||||||
|
|
||||||
|
let g:ycm_max_num_candidates =
|
||||||
|
\ get( g:, 'ycm_max_num_candidates', 50 )
|
||||||
|
|
||||||
|
let g:ycm_extra_conf_globlist =
|
||||||
|
\ get( g:, 'ycm_extra_conf_globlist', [] )
|
||||||
|
|
||||||
|
let g:ycm_global_ycm_extra_conf =
|
||||||
|
\ get( g:, 'ycm_global_ycm_extra_conf', '' )
|
||||||
|
|
||||||
|
let g:ycm_confirm_extra_conf =
|
||||||
|
\ get( g:, 'ycm_confirm_extra_conf', 1 )
|
||||||
|
|
||||||
|
let g:ycm_max_diagnostics_to_display =
|
||||||
|
\ get( g:, 'ycm_max_diagnostics_to_display', 30 )
|
||||||
|
|
||||||
|
let g:ycm_filepath_blacklist =
|
||||||
|
\ get( g:, 'ycm_filepath_blacklist', {
|
||||||
|
\ 'html': 1,
|
||||||
|
\ 'jsx': 1,
|
||||||
|
\ 'xml': 1
|
||||||
|
\ } )
|
||||||
|
|
||||||
|
let g:ycm_auto_start_csharp_server =
|
||||||
|
\ get( g:, 'ycm_auto_start_csharp_server', 1 )
|
||||||
|
|
||||||
|
let g:ycm_auto_stop_csharp_server =
|
||||||
|
\ get( g:, 'ycm_auto_stop_csharp_server', 1 )
|
||||||
|
|
||||||
|
let g:ycm_use_ultisnips_completer =
|
||||||
|
\ get( g:, 'ycm_use_ultisnips_completer', 1 )
|
||||||
|
|
||||||
|
let g:ycm_csharp_server_port =
|
||||||
|
\ get( g:, 'ycm_csharp_server_port', 0 )
|
||||||
|
|
||||||
|
" These options are not documented.
|
||||||
|
let g:ycm_gocode_binary_path =
|
||||||
|
\ get( g:, 'ycm_gocode_binary_path', '' )
|
||||||
|
|
||||||
|
let g:ycm_godef_binary_path =
|
||||||
|
\ get( g:, 'ycm_godef_binary_path', '' )
|
||||||
|
|
||||||
|
let g:ycm_rust_src_path =
|
||||||
|
\ get( g:, 'ycm_rust_src_path', '' )
|
||||||
|
|
||||||
|
let g:ycm_racerd_binary_path =
|
||||||
|
\ get( g:, 'ycm_racerd_binary_path', '' )
|
||||||
|
|
||||||
|
let g:ycm_java_jdtls_use_clean_workspace =
|
||||||
|
\ get( g:, 'ycm_java_jdtls_use_clean_workspace', 1 )
|
||||||
|
|
||||||
|
" This option is deprecated.
|
||||||
|
let g:ycm_python_binary_path =
|
||||||
|
\ get( g:, 'ycm_python_binary_path', '' )
|
||||||
|
|
||||||
if has( 'vim_starting' ) " Loading at startup.
|
if has( 'vim_starting' ) " Loading at startup.
|
||||||
" We defer loading until after VimEnter to allow the gui to fork (see
|
" We defer loading until after VimEnter to allow the gui to fork (see
|
||||||
" `:h gui-fork`) and avoid a deadlock situation, as explained here:
|
" `:h gui-fork`) and avoid a deadlock situation, as explained here:
|
||||||
|
@ -22,38 +22,28 @@ from __future__ import absolute_import
|
|||||||
# Not installing aliases from python-future; it's unreliable and slow.
|
# Not installing aliases from python-future; it's unreliable and slow.
|
||||||
from builtins import * # noqa
|
from builtins import * # noqa
|
||||||
|
|
||||||
from future.utils import iteritems
|
|
||||||
from ycm import vimsupport
|
from ycm import vimsupport
|
||||||
from ycmd import user_options_store
|
|
||||||
from ycmd import identifier_utils
|
from ycmd import identifier_utils
|
||||||
|
|
||||||
YCM_VAR_PREFIX = 'ycm_'
|
YCM_VAR_PREFIX = 'ycm_'
|
||||||
|
|
||||||
|
|
||||||
def BuildServerConf():
|
def GetUserOptions():
|
||||||
"""Builds a dictionary mapping YCM Vim user options to values. Option names
|
"""Builds a dictionary mapping YCM Vim user options to values. Option names
|
||||||
don't have the 'ycm_' prefix."""
|
don't have the 'ycm_' prefix."""
|
||||||
# We only evaluate the keys of the vim globals and not the whole dictionary
|
# We only evaluate the keys of the vim globals and not the whole dictionary
|
||||||
# to avoid unicode issues.
|
# to avoid unicode issues.
|
||||||
# See https://github.com/Valloric/YouCompleteMe/pull/2151 for details.
|
# See https://github.com/Valloric/YouCompleteMe/pull/2151 for details.
|
||||||
keys = vimsupport.GetVimGlobalsKeys()
|
keys = vimsupport.GetVimGlobalsKeys()
|
||||||
server_conf = {}
|
user_options = {}
|
||||||
for key in keys:
|
for key in keys:
|
||||||
if not key.startswith( YCM_VAR_PREFIX ):
|
if not key.startswith( YCM_VAR_PREFIX ):
|
||||||
continue
|
continue
|
||||||
new_key = key[ len( YCM_VAR_PREFIX ): ]
|
new_key = key[ len( YCM_VAR_PREFIX ): ]
|
||||||
new_value = vimsupport.VimExpressionToPythonType( 'g:' + key )
|
new_value = vimsupport.VimExpressionToPythonType( 'g:' + key )
|
||||||
server_conf[ new_key ] = new_value
|
user_options[ new_key ] = new_value
|
||||||
|
|
||||||
return server_conf
|
return user_options
|
||||||
|
|
||||||
|
|
||||||
def LoadJsonDefaultsIntoVim():
|
|
||||||
defaults = user_options_store.DefaultOptions()
|
|
||||||
for key, value in iteritems( defaults ):
|
|
||||||
new_key = 'g:ycm_' + key
|
|
||||||
if not vimsupport.VariableExists( new_key ):
|
|
||||||
vimsupport.SetVariableValue( new_key, value )
|
|
||||||
|
|
||||||
|
|
||||||
def CurrentIdentifierFinished():
|
def CurrentIdentifierFinished():
|
||||||
|
@ -34,10 +34,14 @@ def _EnsureBackwardsCompatibility( arguments ):
|
|||||||
|
|
||||||
|
|
||||||
class CommandRequest( BaseRequest ):
|
class CommandRequest( BaseRequest ):
|
||||||
def __init__( self, arguments, extra_data = None ):
|
def __init__( self,
|
||||||
|
arguments,
|
||||||
|
buffer_command = 'same-buffer',
|
||||||
|
extra_data = None ):
|
||||||
super( CommandRequest, self ).__init__()
|
super( CommandRequest, self ).__init__()
|
||||||
self._arguments = _EnsureBackwardsCompatibility( arguments )
|
self._arguments = _EnsureBackwardsCompatibility( arguments )
|
||||||
self._command = arguments and arguments[ 0 ]
|
self._command = arguments and arguments[ 0 ]
|
||||||
|
self._buffer_command = buffer_command
|
||||||
self._extra_data = extra_data
|
self._extra_data = extra_data
|
||||||
self._response = None
|
self._response = None
|
||||||
|
|
||||||
@ -91,7 +95,8 @@ class CommandRequest( BaseRequest ):
|
|||||||
vimsupport.JumpToLocation( self._response[ 'filepath' ],
|
vimsupport.JumpToLocation( self._response[ 'filepath' ],
|
||||||
self._response[ 'line_num' ],
|
self._response[ 'line_num' ],
|
||||||
self._response[ 'column_num' ],
|
self._response[ 'column_num' ],
|
||||||
modifiers )
|
modifiers,
|
||||||
|
self._buffer_command )
|
||||||
|
|
||||||
|
|
||||||
def _HandleFixitResponse( self ):
|
def _HandleFixitResponse( self ):
|
||||||
@ -129,8 +134,11 @@ class CommandRequest( BaseRequest ):
|
|||||||
vimsupport.WriteToPreviewWindow( self._response[ 'detailed_info' ] )
|
vimsupport.WriteToPreviewWindow( self._response[ 'detailed_info' ] )
|
||||||
|
|
||||||
|
|
||||||
def SendCommandRequest( arguments, modifiers, extra_data = None ):
|
def SendCommandRequest( arguments,
|
||||||
request = CommandRequest( arguments, extra_data )
|
modifiers,
|
||||||
|
buffer_command,
|
||||||
|
extra_data = None ):
|
||||||
|
request = CommandRequest( arguments, buffer_command, extra_data )
|
||||||
# This is a blocking call.
|
# This is a blocking call.
|
||||||
request.Start()
|
request.Start()
|
||||||
request.RunPostCommandActionsIfNeeded( modifiers )
|
request.RunPostCommandActionsIfNeeded( modifiers )
|
||||||
|
@ -37,19 +37,28 @@ from ycm.tests import test_utils
|
|||||||
from ycm.youcompleteme import YouCompleteMe
|
from ycm.youcompleteme import YouCompleteMe
|
||||||
from ycmd.utils import CloseStandardStreams, WaitUntilProcessIsTerminated
|
from ycmd.utils import CloseStandardStreams, WaitUntilProcessIsTerminated
|
||||||
|
|
||||||
# The default options which are only relevant to the client, not the server and
|
# The default options which are required for a working YouCompleteMe object.
|
||||||
# thus are not part of default_options.json, but are required for a working
|
|
||||||
# YouCompleteMe object.
|
|
||||||
DEFAULT_CLIENT_OPTIONS = {
|
DEFAULT_CLIENT_OPTIONS = {
|
||||||
'g:ycm_server_python_interpreter': '',
|
# YCM options
|
||||||
'g:ycm_log_level': 'info',
|
'g:ycm_log_level': 'info',
|
||||||
'g:ycm_keep_logfiles': 0,
|
'g:ycm_keep_logfiles': 0,
|
||||||
'g:ycm_extra_conf_vim_data': [],
|
'g:ycm_extra_conf_vim_data': [],
|
||||||
|
'g:ycm_server_python_interpreter': '',
|
||||||
'g:ycm_show_diagnostics_ui': 1,
|
'g:ycm_show_diagnostics_ui': 1,
|
||||||
'g:ycm_echo_current_diagnostic': 1,
|
|
||||||
'g:ycm_enable_diagnostic_signs': 1,
|
'g:ycm_enable_diagnostic_signs': 1,
|
||||||
'g:ycm_enable_diagnostic_highlighting': 0,
|
'g:ycm_enable_diagnostic_highlighting': 0,
|
||||||
|
'g:ycm_echo_current_diagnostic': 1,
|
||||||
'g:ycm_always_populate_location_list': 0,
|
'g:ycm_always_populate_location_list': 0,
|
||||||
|
'g:ycm_collect_identifiers_from_tags_files': 0,
|
||||||
|
'g:ycm_seed_identifiers_with_syntax': 0,
|
||||||
|
'g:ycm_goto_buffer_command': 'same-buffer',
|
||||||
|
# ycmd options
|
||||||
|
'g:ycm_auto_trigger': 1,
|
||||||
|
'g:ycm_min_num_of_chars_for_completion': 2,
|
||||||
|
'g:ycm_semantic_triggers': {},
|
||||||
|
'g:ycm_filetype_specific_completion_to_disable': { 'gitcommit': 1 },
|
||||||
|
'g:ycm_max_num_candidates': 50,
|
||||||
|
'g:ycm_max_diagnostics_to_display': 30
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,7 +268,8 @@ class Response_Detection_test( object ):
|
|||||||
response[ 'filepath' ],
|
response[ 'filepath' ],
|
||||||
response[ 'line_num' ],
|
response[ 'line_num' ],
|
||||||
response[ 'column_num' ],
|
response[ 'column_num' ],
|
||||||
'rightbelow' )
|
'rightbelow',
|
||||||
|
'same-buffer' )
|
||||||
|
|
||||||
def GoToListTest( command, response ):
|
def GoToListTest( command, response ):
|
||||||
# Note: the detail of these called are tested by
|
# Note: the detail of these called are tested by
|
||||||
|
@ -43,6 +43,7 @@ def SendCommandRequest_ExtraConfVimData_Works_test( ycm ):
|
|||||||
contains(
|
contains(
|
||||||
contains( 'GoTo' ),
|
contains( 'GoTo' ),
|
||||||
'aboveleft',
|
'aboveleft',
|
||||||
|
'same-buffer',
|
||||||
has_entries( {
|
has_entries( {
|
||||||
'options': has_entries( {
|
'options': has_entries( {
|
||||||
'tab_size': 2,
|
'tab_size': 2,
|
||||||
@ -68,6 +69,7 @@ def SendCommandRequest_ExtraConfData_UndefinedValue_test( ycm ):
|
|||||||
contains(
|
contains(
|
||||||
contains( 'GoTo' ),
|
contains( 'GoTo' ),
|
||||||
'belowright',
|
'belowright',
|
||||||
|
'same-buffer',
|
||||||
has_entries( {
|
has_entries( {
|
||||||
'options': has_entries( {
|
'options': has_entries( {
|
||||||
'tab_size': 2,
|
'tab_size': 2,
|
||||||
@ -88,6 +90,7 @@ def SendCommandRequest_BuildRange_NoVisualMarks_test( ycm, *args ):
|
|||||||
send_request.assert_called_once_with(
|
send_request.assert_called_once_with(
|
||||||
[ 'GoTo' ],
|
[ 'GoTo' ],
|
||||||
'',
|
'',
|
||||||
|
'same-buffer',
|
||||||
{
|
{
|
||||||
'options': {
|
'options': {
|
||||||
'tab_size': 2,
|
'tab_size': 2,
|
||||||
@ -120,6 +123,7 @@ def SendCommandRequest_BuildRange_VisualMarks_test( ycm, *args ):
|
|||||||
send_request.assert_called_once_with(
|
send_request.assert_called_once_with(
|
||||||
[ 'GoTo' ],
|
[ 'GoTo' ],
|
||||||
'tab',
|
'tab',
|
||||||
|
'same-buffer',
|
||||||
{
|
{
|
||||||
'options': {
|
'options': {
|
||||||
'tab_size': 2,
|
'tab_size': 2,
|
||||||
@ -146,6 +150,7 @@ def SendCommandRequest_IgnoreFileTypeOption_test( ycm, *args ):
|
|||||||
expected_args = (
|
expected_args = (
|
||||||
[ 'GoTo' ],
|
[ 'GoTo' ],
|
||||||
'',
|
'',
|
||||||
|
'same-buffer',
|
||||||
{
|
{
|
||||||
'options': {
|
'options': {
|
||||||
'tab_size': 2,
|
'tab_size': 2,
|
||||||
|
@ -1680,8 +1680,6 @@ def InsertNamespace_append_test( vim_current, *args ):
|
|||||||
AssertBuffersAreEqualAsBytes( expected_buffer, vim_current.buffer )
|
AssertBuffersAreEqualAsBytes( expected_buffer, vim_current.buffer )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_SameFile_SameBuffer_NoSwapFile_test( vim_command ):
|
def JumpToLocation_SameFile_SameBuffer_NoSwapFile_test( vim_command ):
|
||||||
# No 'u' prefix for the current buffer name string to simulate Vim returning
|
# No 'u' prefix for the current buffer name string to simulate Vim returning
|
||||||
@ -1691,7 +1689,8 @@ def JumpToLocation_SameFile_SameBuffer_NoSwapFile_test( vim_command ):
|
|||||||
vimsupport.JumpToLocation( os.path.realpath( u'uni¢𐍈d€' ),
|
vimsupport.JumpToLocation( os.path.realpath( u'uni¢𐍈d€' ),
|
||||||
2,
|
2,
|
||||||
5,
|
5,
|
||||||
'aboveleft' )
|
'aboveleft',
|
||||||
|
'same-buffer' )
|
||||||
|
|
||||||
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
@ -1700,15 +1699,13 @@ def JumpToLocation_SameFile_SameBuffer_NoSwapFile_test( vim_command ):
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_SameBuffer_Unmodified_test( vim_command ):
|
def JumpToLocation_DifferentFile_SameBuffer_Unmodified_test( vim_command ):
|
||||||
current_buffer = VimBuffer( 'uni¢𐍈d€' )
|
current_buffer = VimBuffer( 'uni¢𐍈d€' )
|
||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'belowright' )
|
vimsupport.JumpToLocation( target_name, 2, 5, 'belowright', 'same-buffer' )
|
||||||
|
|
||||||
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
@ -1718,8 +1715,6 @@ def JumpToLocation_DifferentFile_SameBuffer_Unmodified_test( vim_command ):
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_SameBuffer_Modified_CannotHide_test(
|
def JumpToLocation_DifferentFile_SameBuffer_Modified_CannotHide_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1728,7 +1723,7 @@ def JumpToLocation_DifferentFile_SameBuffer_Modified_CannotHide_test(
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'botright' )
|
vimsupport.JumpToLocation( target_name, 2, 5, 'botright', 'same-buffer' )
|
||||||
|
|
||||||
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
@ -1738,8 +1733,6 @@ def JumpToLocation_DifferentFile_SameBuffer_Modified_CannotHide_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_SameBuffer_Modified_CanHide_test(
|
def JumpToLocation_DifferentFile_SameBuffer_Modified_CanHide_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1748,7 +1741,7 @@ def JumpToLocation_DifferentFile_SameBuffer_Modified_CanHide_test(
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ) as vim:
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'leftabove' )
|
vimsupport.JumpToLocation( target_name, 2, 5, 'leftabove', 'same-buffer' )
|
||||||
|
|
||||||
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
assert_that( vim.current.window.cursor, equal_to( ( 2, 4 ) ) )
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
@ -1758,8 +1751,6 @@ def JumpToLocation_DifferentFile_SameBuffer_Modified_CanHide_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command',
|
@patch( 'vim.command',
|
||||||
side_effect = [ None, VimError( 'Unknown code' ), None ] )
|
side_effect = [ None, VimError( 'Unknown code' ), None ] )
|
||||||
def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Unexpected_test(
|
def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Unexpected_test(
|
||||||
@ -1769,13 +1760,15 @@ def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Unexpected_test(
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
||||||
assert_that(
|
assert_that(
|
||||||
calling( vimsupport.JumpToLocation ).with_args(
|
calling( vimsupport.JumpToLocation ).with_args(
|
||||||
os.path.realpath( u'different_uni¢𐍈d€' ), 2, 5, 'rightbelow' ),
|
os.path.realpath( u'different_uni¢𐍈d€' ),
|
||||||
|
2,
|
||||||
|
5,
|
||||||
|
'rightbelow',
|
||||||
|
'same-buffer' ),
|
||||||
raises( VimError, 'Unknown code' )
|
raises( VimError, 'Unknown code' )
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command',
|
@patch( 'vim.command',
|
||||||
new_callable = ExtendedMock,
|
new_callable = ExtendedMock,
|
||||||
side_effect = [ None, VimError( 'E325' ), None ] )
|
side_effect = [ None, VimError( 'E325' ), None ] )
|
||||||
@ -1784,7 +1777,7 @@ def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Quit_test( vim_command ):
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'topleft' )
|
vimsupport.JumpToLocation( target_name, 2, 5, 'topleft', 'same-buffer' )
|
||||||
|
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
call( 'normal! m\'' ),
|
call( 'normal! m\'' ),
|
||||||
@ -1792,8 +1785,6 @@ def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Quit_test( vim_command ):
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'same-buffer' } )
|
|
||||||
@patch( 'vim.command',
|
@patch( 'vim.command',
|
||||||
new_callable = ExtendedMock,
|
new_callable = ExtendedMock,
|
||||||
side_effect = [ None, KeyboardInterrupt, None ] )
|
side_effect = [ None, KeyboardInterrupt, None ] )
|
||||||
@ -1802,7 +1793,7 @@ def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Abort_test( vim_command ):
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'vertical' )
|
vimsupport.JumpToLocation( target_name, 2, 5, 'vertical', 'same-buffer' )
|
||||||
|
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
call( 'normal! m\'' ),
|
call( 'normal! m\'' ),
|
||||||
@ -1810,8 +1801,6 @@ def JumpToLocation_DifferentFile_SameBuffer_SwapFile_Abort_test( vim_command ):
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'split-or-existing-window' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_Split_CurrentTab_NotAlreadyOpened_test(
|
def JumpToLocation_DifferentFile_Split_CurrentTab_NotAlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1824,7 +1813,11 @@ def JumpToLocation_DifferentFile_Split_CurrentTab_NotAlreadyOpened_test(
|
|||||||
|
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'aboveleft' )
|
vimsupport.JumpToLocation( target_name,
|
||||||
|
2,
|
||||||
|
5,
|
||||||
|
'aboveleft',
|
||||||
|
'split-or-existing-window' )
|
||||||
|
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
call( 'normal! m\'' ),
|
call( 'normal! m\'' ),
|
||||||
@ -1833,8 +1826,6 @@ def JumpToLocation_DifferentFile_Split_CurrentTab_NotAlreadyOpened_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'split-or-existing-window' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_test(
|
def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1849,7 +1840,10 @@ def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_test(
|
|||||||
vim.current.tabpage = current_tab
|
vim.current.tabpage = current_tab
|
||||||
|
|
||||||
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
||||||
2, 5, 'belowright' )
|
2,
|
||||||
|
5,
|
||||||
|
'belowright',
|
||||||
|
'split-or-existing-window' )
|
||||||
|
|
||||||
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
||||||
assert_that( vim.current.window, equal_to( different_window ) )
|
assert_that( vim.current.window, equal_to( different_window ) )
|
||||||
@ -1860,8 +1854,6 @@ def JumpToLocation_DifferentFile_Split_CurrentTab_AlreadyOpened_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'split-or-existing-window' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_Split_AllTabs_NotAlreadyOpened_test(
|
def JumpToLocation_DifferentFile_Split_AllTabs_NotAlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1870,7 +1862,11 @@ def JumpToLocation_DifferentFile_Split_AllTabs_NotAlreadyOpened_test(
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'tab' )
|
vimsupport.JumpToLocation( target_name,
|
||||||
|
2,
|
||||||
|
5,
|
||||||
|
'tab',
|
||||||
|
'split-or-existing-window' )
|
||||||
|
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
call( 'normal! m\'' ),
|
call( 'normal! m\'' ),
|
||||||
@ -1879,8 +1875,6 @@ def JumpToLocation_DifferentFile_Split_AllTabs_NotAlreadyOpened_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'split-or-existing-window' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_Split_AllTabs_AlreadyOpened_test(
|
def JumpToLocation_DifferentFile_Split_AllTabs_AlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1894,7 +1888,10 @@ def JumpToLocation_DifferentFile_Split_AllTabs_AlreadyOpened_test(
|
|||||||
with MockVimBuffers( [ current_buffer, different_buffer ],
|
with MockVimBuffers( [ current_buffer, different_buffer ],
|
||||||
[ current_buffer ] ) as vim:
|
[ current_buffer ] ) as vim:
|
||||||
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
||||||
2, 5, 'tab' )
|
2,
|
||||||
|
5,
|
||||||
|
'tab',
|
||||||
|
'split-or-existing-window' )
|
||||||
|
|
||||||
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
||||||
assert_that( vim.current.window, equal_to( different_window ) )
|
assert_that( vim.current.window, equal_to( different_window ) )
|
||||||
@ -1905,8 +1902,6 @@ def JumpToLocation_DifferentFile_Split_AllTabs_AlreadyOpened_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'new-or-existing-tab' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_NewOrExistingTab_NotAlreadyOpened_test(
|
def JumpToLocation_DifferentFile_NewOrExistingTab_NotAlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1915,7 +1910,11 @@ def JumpToLocation_DifferentFile_NewOrExistingTab_NotAlreadyOpened_test(
|
|||||||
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
with MockVimBuffers( [ current_buffer ], [ current_buffer ] ):
|
||||||
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
target_name = os.path.realpath( u'different_uni¢𐍈d€' )
|
||||||
|
|
||||||
vimsupport.JumpToLocation( target_name, 2, 5, 'aboveleft vertical' )
|
vimsupport.JumpToLocation( target_name,
|
||||||
|
2,
|
||||||
|
5,
|
||||||
|
'aboveleft vertical',
|
||||||
|
'new-or-existing-tab' )
|
||||||
|
|
||||||
vim_command.assert_has_exact_calls( [
|
vim_command.assert_has_exact_calls( [
|
||||||
call( 'normal! m\'' ),
|
call( 'normal! m\'' ),
|
||||||
@ -1924,8 +1923,6 @@ def JumpToLocation_DifferentFile_NewOrExistingTab_NotAlreadyOpened_test(
|
|||||||
] )
|
] )
|
||||||
|
|
||||||
|
|
||||||
@patch( 'ycmd.user_options_store._USER_OPTIONS',
|
|
||||||
{ 'goto_buffer_command': 'new-or-existing-tab' } )
|
|
||||||
@patch( 'vim.command', new_callable = ExtendedMock )
|
@patch( 'vim.command', new_callable = ExtendedMock )
|
||||||
def JumpToLocation_DifferentFile_NewOrExistingTab_AlreadyOpened_test(
|
def JumpToLocation_DifferentFile_NewOrExistingTab_AlreadyOpened_test(
|
||||||
vim_command ):
|
vim_command ):
|
||||||
@ -1939,7 +1936,10 @@ def JumpToLocation_DifferentFile_NewOrExistingTab_AlreadyOpened_test(
|
|||||||
with MockVimBuffers( [ current_buffer, different_buffer ],
|
with MockVimBuffers( [ current_buffer, different_buffer ],
|
||||||
[ current_buffer ] ) as vim:
|
[ current_buffer ] ) as vim:
|
||||||
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
vimsupport.JumpToLocation( os.path.realpath( u'different_uni¢𐍈d€' ),
|
||||||
2, 5, 'belowright tab' )
|
2,
|
||||||
|
5,
|
||||||
|
'belowright tab',
|
||||||
|
'new-or-existing-tab' )
|
||||||
|
|
||||||
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
assert_that( vim.current.tabpage, equal_to( current_tab ) )
|
||||||
assert_that( vim.current.window, equal_to( different_window ) )
|
assert_that( vim.current.window, equal_to( different_window ) )
|
||||||
|
@ -31,7 +31,6 @@ import re
|
|||||||
from collections import defaultdict, namedtuple
|
from collections import defaultdict, namedtuple
|
||||||
from ycmd.utils import ( ByteOffsetToCodepointOffset, GetCurrentDirectory,
|
from ycmd.utils import ( ByteOffsetToCodepointOffset, GetCurrentDirectory,
|
||||||
JoinLinesAsUnicode, ToBytes, ToUnicode )
|
JoinLinesAsUnicode, ToBytes, ToUnicode )
|
||||||
from ycmd import user_options_store
|
|
||||||
|
|
||||||
BUFFER_COMMAND_MAP = { 'same-buffer' : 'edit',
|
BUFFER_COMMAND_MAP = { 'same-buffer' : 'edit',
|
||||||
'split' : 'split',
|
'split' : 'split',
|
||||||
@ -511,7 +510,7 @@ def JumpToFile( filename, command, modifiers ):
|
|||||||
|
|
||||||
|
|
||||||
# Both |line| and |column| need to be 1-based
|
# Both |line| and |column| need to be 1-based
|
||||||
def JumpToLocation( filename, line, column, modifiers ):
|
def JumpToLocation( filename, line, column, modifiers, command ):
|
||||||
# Add an entry to the jumplist
|
# Add an entry to the jumplist
|
||||||
vim.command( "normal! m'" )
|
vim.command( "normal! m'" )
|
||||||
|
|
||||||
@ -522,24 +521,22 @@ def JumpToLocation( filename, line, column, modifiers ):
|
|||||||
# location, not to the start of the newly opened file.
|
# location, not to the start of the newly opened file.
|
||||||
# Sadly this fails on random occasions and the undesired jump remains in the
|
# Sadly this fails on random occasions and the undesired jump remains in the
|
||||||
# jumplist.
|
# jumplist.
|
||||||
user_command = user_options_store.Value( 'goto_buffer_command' )
|
if command == 'split-or-existing-window':
|
||||||
|
|
||||||
if user_command == 'split-or-existing-window':
|
|
||||||
if 'tab' in modifiers:
|
if 'tab' in modifiers:
|
||||||
if TryJumpLocationInTabs( filename, line, column ):
|
if TryJumpLocationInTabs( filename, line, column ):
|
||||||
return
|
return
|
||||||
elif TryJumpLocationInTab( vim.current.tabpage, filename, line, column ):
|
elif TryJumpLocationInTab( vim.current.tabpage, filename, line, column ):
|
||||||
return
|
return
|
||||||
user_command = 'split'
|
command = 'split'
|
||||||
|
|
||||||
# This command is kept for backward compatibility. :tab should be used with
|
# This command is kept for backward compatibility. :tab should be used with
|
||||||
# the 'split-or-existing-window' command instead.
|
# the 'split-or-existing-window' command instead.
|
||||||
if user_command == 'new-or-existing-tab':
|
if command == 'new-or-existing-tab':
|
||||||
if TryJumpLocationInTabs( filename, line, column ):
|
if TryJumpLocationInTabs( filename, line, column ):
|
||||||
return
|
return
|
||||||
user_command = 'new-tab'
|
command = 'new-tab'
|
||||||
|
|
||||||
if not JumpToFile( filename, user_command, modifiers ):
|
if not JumpToFile( filename, command, modifiers ):
|
||||||
return
|
return
|
||||||
|
|
||||||
vim.current.window.cursor = ( line, column - 1 )
|
vim.current.window.cursor = ( line, column - 1 )
|
||||||
|
@ -35,7 +35,7 @@ from ycm import base, paths, vimsupport
|
|||||||
from ycm.buffer import ( BufferDict,
|
from ycm.buffer import ( BufferDict,
|
||||||
DIAGNOSTIC_UI_FILETYPES,
|
DIAGNOSTIC_UI_FILETYPES,
|
||||||
DIAGNOSTIC_UI_ASYNC_FILETYPES )
|
DIAGNOSTIC_UI_ASYNC_FILETYPES )
|
||||||
from ycmd import server_utils, user_options_store, utils
|
from ycmd import server_utils, utils
|
||||||
from ycmd.request_wrap import RequestWrap
|
from ycmd.request_wrap import RequestWrap
|
||||||
from ycm.omni_completer import OmniCompleter
|
from ycm.omni_completer import OmniCompleter
|
||||||
from ycm import syntax_parse
|
from ycm import syntax_parse
|
||||||
@ -133,9 +133,7 @@ class YouCompleteMe( object ):
|
|||||||
self._server_is_ready_with_cache = False
|
self._server_is_ready_with_cache = False
|
||||||
self._message_poll_request = None
|
self._message_poll_request = None
|
||||||
|
|
||||||
base.LoadJsonDefaultsIntoVim()
|
self._user_options = base.GetUserOptions()
|
||||||
user_options_store.SetAll( base.BuildServerConf() )
|
|
||||||
self._user_options = user_options_store.GetAll()
|
|
||||||
self._omnicomp = OmniCompleter( self._user_options )
|
self._omnicomp = OmniCompleter( self._user_options )
|
||||||
self._buffers = BufferDict( self._user_options )
|
self._buffers = BufferDict( self._user_options )
|
||||||
|
|
||||||
@ -344,7 +342,10 @@ class YouCompleteMe( object ):
|
|||||||
extra_data.update( vimsupport.BuildRange( start_line, end_line ) )
|
extra_data.update( vimsupport.BuildRange( start_line, end_line ) )
|
||||||
self._AddExtraConfDataIfNeeded( extra_data )
|
self._AddExtraConfDataIfNeeded( extra_data )
|
||||||
|
|
||||||
return SendCommandRequest( final_arguments, modifiers, extra_data )
|
return SendCommandRequest( final_arguments,
|
||||||
|
modifiers,
|
||||||
|
self._user_options[ 'goto_buffer_command' ],
|
||||||
|
extra_data )
|
||||||
|
|
||||||
|
|
||||||
def GetDefinedSubcommands( self ):
|
def GetDefinedSubcommands( self ):
|
||||||
|
Loading…
Reference in New Issue
Block a user