Ejemplo n.º 1
0
def RunInstaller( api_prefix, leave_open, *args, **kwargs ):
  from vimspector import utils, output, settings
  import vim

  if not args:
    args = settings.List( 'install_gadgets' )

  if not args:
    return

  args = GadgetListToInstallerArgs( *args )

  vimspector_home = utils.GetVimValue( vim.vars, 'vimspector_home' )
  vimspector_base_dir = utils.GetVimspectorBase()

  global OUTPUT_VIEW
  _ResetInstaller()

  with utils.RestoreCurrentWindow():
    vim.command( f'botright { settings.Int( "bottombar_height" ) }new' )
    win = vim.current.window
    OUTPUT_VIEW = output.OutputView( win, api_prefix )

  cmd = [
    PathToAnyWorkingPython3(),
    '-u',
    os.path.join( vimspector_home, 'install_gadget.py' ),
    '--quiet',
    '--update-gadget-config',
  ]
  if not vimspector_base_dir == vimspector_home:
    cmd.extend( [ '--basedir', vimspector_base_dir ] )
  cmd.extend( args )

  def handler( exit_code ):
    if exit_code == 0:
      if not leave_open:
        _ResetInstaller()
      utils.UserMessage( "Vimspector gadget installation complete!" )
      vim.command( 'silent doautocmd User VimspectorInstallSuccess' )
      if 'then' in kwargs:
        kwargs[ 'then' ]()
    else:
      utils.UserMessage( 'Vimspector gadget installation reported errors',
                         error = True )
      vim.command( 'silent doautocmd User VimspectorInstallFailed' )


  OUTPUT_VIEW.RunJobWithOutput( 'Installer',
                                cmd,
                                completion_handler = handler,
                                syntax = 'vimspector-installer' )
  OUTPUT_VIEW.ShowOutput( 'Installer' )
Ejemplo n.º 2
0
def DefineSign(name, text, double_text, texthl, col='right', **kwargs):
    if utils.GetVimValue(vim.options, 'ambiwidth', '') == 'double':
        text = double_text

    if col == 'right':
        if int(utils.Call('strdisplaywidth', text)) < 2:
            text = ' ' + text

    text = text.replace(' ', r'\ ')

    cmd = f'sign define { name } text={ text } texthl={ texthl }'
    for key, value in kwargs.items():
        cmd += f' { key }={ value }'

    vim.command(cmd)
Ejemplo n.º 3
0
def Get( option: str, cls=str ):
  return cls( utils.GetVimValue( vim.vars,
                                 f'vimspector_{ option }',
                                 DEFAULTS.get( option, cls() ) ) )
Ejemplo n.º 4
0
def Get(option: str, default=None, cls=str):
    return cls(utils.GetVimValue(vim.vars, f'vimspector_{ option }', default))
Ejemplo n.º 5
0
def Dict( option: str ):
  d = DICT_TYPE( DEFAULTS.get( option, {} ) )
  d.update( utils.GetVimValue( vim.vars,
                               f'vimspector_{ option }',
                               {} ) )
  return d
Ejemplo n.º 6
0
def LaunchTerminal(api_prefix, params, window_for_start, existing_term):
    if not existing_term:
        term = Terminal()
    else:
        term = existing_term

    cwd = params['cwd'] or os.getcwd()
    args = params['args'] or []
    env = params.get('env') or {}

    term_options = {
        'norestore': 1,
        'cwd': cwd,
        'env': env,
    }

    if settings.Get('ui_mode') == 'horizontal':
        # force-horizontal
        term_options['vertical'] = 1
    elif utils.GetVimValue(vim.vars['vimspector_session_windows'],
                           'mode') == 'horizontal':
        # horizontal, which means that we should have enough space for:
        #  - sidebar
        #  - code min
        #  - term min width
        #  - + 2 vertical spaders
        #  - + 3 columns for signs
        term_options['vertical'] = 1

        # if we don't have enough space for terminal_maxwidth, then see if we have
        # enough vertically for terminal_maxheight, in which case,
        # that seems a better fit
        term_horiz_max = (settings.Int('sidebar_width') + 1 + 2 + 3 +
                          settings.Int('code_minwidth') + 1 +
                          settings.Int('terminal_maxwidth'))
        term_vert_max = (settings.Int('bottombar_height') + 1 +
                         settings.Int('code_minheight') + 1 +
                         settings.Int('terminal_minheight'))

        if (vim.options['columns'] < term_horiz_max
                and vim.options['lines'] >= term_vert_max):
            # Looks like it, let's try that layout
            term_options['vertical'] = 0

    else:
        # vertical - we need enough space horizontally for the code+terminal, but we
        # may fit better with code above terminal
        term_options['vertical'] = 0

        term_horiz_max = (settings.Int('code_minwidth') + 3 +
                          settings.Int('terminal_maxwidth') + 1)

        if vim.options['columns'] > term_horiz_max:
            term_options['vertical'] = 1

    if not window_for_start or not window_for_start.valid:
        # TOOD: Where? Maybe we should just use botright vertical ...
        window_for_start = vim.current.window

    if term.window is not None and term.window.valid:
        assert term.buffer_number
        window_for_start = term.window
        if (term.window.buffer.number == term.buffer_number and int(
                utils.Call(
                    'vimspector#internal#{}term#IsFinished'.format(api_prefix),
                    term.buffer_number))):
            term_options['curwin'] = 1
        else:
            term_options['vertical'] = 0

    buffer_number = None
    terminal_window = None
    with utils.LetCurrentWindow(window_for_start):
        # If we're making a vertical split from the code window, make it no more
        # than 80 columns and no fewer than 10. Also try and keep the code window
        # at least 82 columns
        if term_options.get('curwin', 0):
            pass
        elif term_options['vertical']:
            term_options['term_cols'] = max(
                min(
                    int(vim.eval('winwidth( 0 )')) -
                    settings.Int('code_minwidth'),
                    settings.Int('terminal_maxwidth')),
                settings.Int('terminal_minwidth'))
        else:
            term_options['term_rows'] = max(
                min(
                    int(vim.eval('winheight( 0 )')) -
                    settings.Int('code_minheight'),
                    settings.Int('terminal_maxheight')),
                settings.Int('terminal_minheight'))

        buffer_number = int(
            utils.Call('vimspector#internal#{}term#Start'.format(api_prefix),
                       args, term_options))
        terminal_window = vim.current.window

    if buffer_number is None or buffer_number <= 0:
        # TODO: Do something better like reject the request?
        raise ValueError("Unable to start terminal")

    term.window = terminal_window
    term.buffer_number = buffer_number

    utils.UpdateSessionWindows(
        {'terminal': utils.WindowID(term.window, vim.current.tabpage)})
    with utils.RestoreCursorPosition():
        with utils.RestoreCurrentWindow():
            with utils.RestoreCurrentBuffer(vim.current.window):
                vim.command('doautocmd User VimspectorTerminalOpened')

    return term