Exemple #1
0
    def _CreateBuffer(self,
                      category,
                      file_name=None,
                      cmd=None,
                      completion_handler=None,
                      syntax=None):

        buf_to_delete = None
        if (not self._buffers and self._window is not None
                and self._window.valid and not self._window.buffer.name):
            # If there's an empty buffer in the current window that we're not using,
            # delete it. We could try and use it, but that complicates the call to
            # SetUpCommandBuffer
            buf_to_delete = self._window.buffer

        if file_name is not None:
            assert cmd is None
            if install.GetOS() == "windows":
                # FIXME: Can't display fiels in windows (yet?)
                return

            cmd = ['tail', '-F', '-n', '+1', '--', file_name]

        if cmd is not None:
            out = utils.SetUpCommandBuffer(
                cmd,
                category,
                self._api_prefix,
                completion_handler=completion_handler)

            self._buffers[category] = TabBuffer(out, len(self._buffers))
            self._buffers[category].is_job = True
            self._RenderWinBar(category)
        else:
            if category == 'Console':
                name = 'vimspector.Console'
            else:
                name = 'vimspector.Output:{0}'.format(category)

            tab_buffer = TabBuffer(utils.NewEmptyBuffer(), len(self._buffers))

            self._buffers[category] = tab_buffer

            if category == 'Console':
                utils.SetUpPromptBuffer(tab_buffer.buf, name, '> ',
                                        'vimspector#EvaluateConsole',
                                        'vimspector#OmniFuncConsole')
            else:
                utils.SetUpHiddenBuffer(tab_buffer.buf, name)

            self._RenderWinBar(category)

        self._buffers[category].syntax = utils.SetSyntax(
            self._buffers[category].syntax, syntax,
            self._buffers[category].buf)

        if buf_to_delete:
            with utils.RestoreCurrentWindow():
                self._ShowOutput(category)
            utils.CleanUpHiddenBuffer(buf_to_delete)
Exemple #2
0
    def _CreateBuffer(self, category, file_name=None, cmd=None):
        with utils.LetCurrentWindow(self._window):
            with utils.RestoreCurrentBuffer(self._window):

                if file_name is not None:
                    assert cmd is None
                    cmd = ['tail', '-F', '-n', '+1', '--', file_name]

                if cmd is not None:
                    out, err = utils.SetUpCommandBuffer(cmd, category)
                    self._buffers[category + '-out'] = TabBuffer(
                        out, len(self._buffers))
                    self._buffers[category + '-out'].is_job = True
                    self._buffers[category + '-err'] = TabBuffer(
                        err, len(self._buffers))
                    self._buffers[category + '-err'].is_job = False
                    self._RenderWinBar(category + '-out')
                    self._RenderWinBar(category + '-err')
                else:
                    vim.command('enew')
                    tab_buffer = TabBuffer(vim.current.buffer,
                                           len(self._buffers))
                    self._buffers[category] = tab_buffer
                    if category == 'Console':
                        utils.SetUpPromptBuffer(tab_buffer.buf,
                                                'vimspector.Console',
                                                '> ',
                                                'vimspector#EvaluateConsole',
                                                hidden=True)
                    else:
                        utils.SetUpHiddenBuffer(
                            tab_buffer.buf,
                            'vimspector.Output:{0}'.format(category))

                    self._RenderWinBar(category)
Exemple #3
0
    def __init__(self, session, win):
        self._logger = logging.getLogger(__name__)
        utils.SetUpLogging(self._logger)

        self._buf = win.buffer
        self._session = session
        self._connection = None

        self._current_thread = None
        self._current_frame = None
        self._current_syntax = ""

        self._threads = []
        self._sources = {}
        self._scratch_buffers = []

        utils.SetUpHiddenBuffer(self._buf, 'vimspector.StackTrace')
        utils.SetUpUIWindow(win)

        vim.command('nnoremap <buffer> <CR> :call vimspector#GoToFrame()<CR>')

        self._line_to_frame = {}
        self._line_to_thread = {}

        # TODO: We really need a proper state model
        #
        # AWAIT_CONNECTION -- OnServerReady / RequestThreads --> REQUESTING_THREADS
        # REQUESTING -- OnGotThreads / RequestScopes --> REQUESTING_SCOPES
        #
        # When we attach using gdbserver, this whole thing breaks because we request
        # the threads over and over and get duff data back on later threads.
        self._requesting_threads = False
Exemple #4
0
    def __init__(self, variables_win, watches_win):
        self._logger = logging.getLogger(__name__)
        utils.SetUpLogging(self._logger)

        self._connection = None
        self._current_syntax = ''

        # Set up the "Variables" buffer in the variables_win
        self._scopes: typing.List[Scope] = []
        self._vars = View(variables_win, {}, self._DrawScopes)
        utils.SetUpHiddenBuffer(self._vars.buf, 'vimspector.Variables')
        with utils.LetCurrentWindow(variables_win):
            vim.command(
                'nnoremap <buffer> <CR> :call vimspector#ExpandVariable()<CR>')

        # Set up the "Watches" buffer in the watches_win (and create a WinBar in
        # there)
        self._watches: typing.List[Watch] = []
        self._watch = View(watches_win, {}, self._DrawWatches)
        utils.SetUpPromptBuffer(self._watch.buf, 'vimspector.Watches',
                                'Expression: ', 'vimspector#AddWatchPrompt',
                                'vimspector#OmniFuncWatch')
        with utils.LetCurrentWindow(watches_win):
            vim.command(
                'nnoremap <buffer> <CR> :call vimspector#ExpandVariable()<CR>')
            vim.command(
                'nnoremap <buffer> <DEL> :call vimspector#DeleteWatch()<CR>')

            vim.command('nnoremenu 1.1 WinBar.New '
                        ':call vimspector#AddWatch()<CR>')
            vim.command('nnoremenu 1.2 WinBar.Expand/Collapse '
                        ':call vimspector#ExpandVariable()<CR>')
            vim.command('nnoremenu 1.3 WinBar.Delete '
                        ':call vimspector#DeleteWatch()<CR>')

        # Set the (global!) balloon expr if supported
        has_balloon = int(vim.eval("has( 'balloon_eval' )"))
        has_balloon_term = int(vim.eval("has( 'balloon_eval_term' )"))

        self._oldoptions = {}
        if has_balloon or has_balloon_term:
            self._oldoptions = {
                'balloonexpr': vim.options['balloonexpr'],
                'balloondelay': vim.options['balloondelay'],
            }
            vim.options[
                'balloonexpr'] = 'vimspector#internal#balloon#BalloonExpr()'
            vim.options['balloondelay'] = 250

        if has_balloon:
            self._oldoptions['ballooneval'] = vim.options['ballooneval']
            vim.options['ballooneval'] = True

        if has_balloon_term:
            self._oldoptions['balloonevalterm'] = vim.options[
                'balloonevalterm']
            vim.options['balloonevalterm'] = True

        self._is_term = not bool(int(vim.eval("has( 'gui_running' )")))
    def __init__(self, session, win):
        self._logger = logging.getLogger(__name__)
        utils.SetUpLogging(self._logger)

        self._buf = win.buffer
        self._session = session
        self._connection = None

        self._current_thread = None
        self._current_frame = None
        self._current_syntax = ""

        self._threads = []
        self._sources = {}
        self._scratch_buffers = []

        # FIXME: This ID is by group, so should be module scope
        self._next_sign_id = 1

        utils.SetUpHiddenBuffer(self._buf, 'vimspector.StackTrace')
        utils.SetUpUIWindow(win)

        mappings = settings.Dict('mappings')['stack_trace']

        with utils.LetCurrentWindow(win):
            for mapping in utils.GetVimList(mappings, 'expand_or_jump'):
                vim.command(f'nnoremap <silent> <buffer> { mapping } '
                            ':<C-U>call vimspector#GoToFrame()<CR>')

            for mapping in utils.GetVimList(mappings, 'focus_thread'):
                vim.command(f'nnoremap <silent> <buffer> { mapping } '
                            ':<C-U>call vimspector#SetCurrentThread()<CR>')

            if utils.UseWinBar():
                vim.command('nnoremenu <silent> 1.1 WinBar.Pause/Continue '
                            ':call vimspector#PauseContinueThread()<CR>')
                vim.command('nnoremenu <silent> 1.2 WinBar.Expand/Collapse '
                            ':call vimspector#GoToFrame()<CR>')
                vim.command('nnoremenu <silent> 1.3 WinBar.Focus '
                            ':call vimspector#SetCurrentThread()<CR>')

        win.options['cursorline'] = False

        if not signs.SignDefined('vimspectorCurrentThread'):
            signs.DefineSign('vimspectorCurrentThread',
                             text='▶ ',
                             double_text='▶',
                             texthl='MatchParen',
                             linehl='CursorLine')

        self._line_to_frame = {}
        self._line_to_thread = {}

        self._requesting_threads = StackTraceView.ThreadRequestState.NO
        self._pending_thread_request = None
Exemple #6
0
            def consume_source(msg):
                self._sources[source_reference] = source

                buf_name = os.path.join('_vimspector_tmp',
                                        source.get('path', source['name']))

                self._logger.debug("Received source %s: %s", buf_name, msg)

                buf = utils.BufferForFile(buf_name)
                self._scratch_buffers.append(buf)
                utils.SetUpHiddenBuffer(buf, buf_name)
                source['path'] = buf_name
                with utils.ModifiableScratchBuffer(buf):
                    utils.SetBufferContents(buf, msg['body']['content'])

                and_then(self._sources[source_reference])
Exemple #7
0
  def _CreateBuffer( self,
                     category,
                     file_name = None,
                     cmd = None,
                     completion_handler = None,
                     syntax = None ):
    if file_name is not None:
      assert cmd is None
      if install.GetOS() == "windows":
        # FIXME: Can't display fiels in windows (yet?)
        return

      cmd = [ 'tail', '-F', '-n', '+1', '--', file_name ]

    if cmd is not None:
      out = utils.SetUpCommandBuffer(
        cmd,
        category,
        self._api_prefix,
        completion_handler = completion_handler )
      self._buffers[ category ] = TabBuffer( out, len( self._buffers ) )
      self._buffers[ category ].is_job = True
      self._RenderWinBar( category )
    else:
      if category == 'Console':
        name = 'vimspector.Console'
      else:
        name = 'vimspector.Output:{0}'.format( category )

      tab_buffer = TabBuffer( utils.NewEmptyBuffer(), len( self._buffers ) )
      self._buffers[ category ] = tab_buffer

      if category == 'Console':
        utils.SetUpPromptBuffer( tab_buffer.buf,
                                 name,
                                 '> ',
                                 'vimspector#EvaluateConsole' )
      else:
        utils.SetUpHiddenBuffer( tab_buffer.buf, name )

      self._RenderWinBar( category )

    self._buffers[ category ].syntax = utils.SetSyntax(
      self._buffers[ category ].syntax,
      syntax,
      self._buffers[ category ].buf )
Exemple #8
0
    def _CreateBuffer(self, category, file_name=None, cmd=None):
        win = self._window
        if not win.valid:
            # We need to borrow the current window
            win = vim.current.window

        with utils.LetCurrentWindow(win):
            with utils.RestoreCurrentBuffer(win):

                if file_name is not None:
                    assert cmd is None
                    if install.GetOS() == "windows":
                        # FIXME: Can't display fiels in windows (yet?)
                        return

                    cmd = ['tail', '-F', '-n', '+1', '--', file_name]

                if cmd is not None:
                    out, err = utils.SetUpCommandBuffer(
                        cmd, category, self._api_prefix)
                    self._buffers[category + '-out'] = TabBuffer(
                        out, len(self._buffers))
                    self._buffers[category + '-out'].is_job = True
                    self._buffers[category + '-out'].job_category = category
                    self._buffers[category + '-err'] = TabBuffer(
                        err, len(self._buffers))
                    self._buffers[category + '-err'].is_job = False
                    self._RenderWinBar(category + '-out')
                    self._RenderWinBar(category + '-err')
                else:
                    vim.command('enew')
                    tab_buffer = TabBuffer(vim.current.buffer,
                                           len(self._buffers))
                    self._buffers[category] = tab_buffer
                    if category == 'Console':
                        utils.SetUpPromptBuffer(tab_buffer.buf,
                                                'vimspector.Console', '> ',
                                                'vimspector#EvaluateConsole')
                    else:
                        utils.SetUpHiddenBuffer(
                            tab_buffer.buf,
                            'vimspector.Output:{0}'.format(category))

                    self._RenderWinBar(category)
Exemple #9
0
    def _CreateBuffer(self, category):
        with utils.RestoreCurrentWindow():
            vim.current.window = self._window

            with utils.RestoreCurrentBuffer(self._window):
                vim.command('enew')
                self._buffers[category] = vim.current.buffer

                if category == 'Console':
                    utils.SetUpPromptBuffer(self._buffers[category],
                                            'vimspector.Console',
                                            '> ',
                                            'vimspector#EvaluateConsole',
                                            hidden=True)
                else:
                    utils.SetUpHiddenBuffer(
                        self._buffers[category],
                        'vimspector.Output:{0}'.format(category))

                vim.command("nnoremenu WinBar.{0} "
                            ":call vimspector#ShowOutput( '{0}' )<CR>".format(
                                utils.Escape(category)))
Exemple #10
0
    def ShowMemory(self, memoryReference, length, offset, msg):
        if not self._window.valid:
            return False

        buf_name = os.path.join('_vimspector_mem', memoryReference)
        buf = utils.BufferForFile(buf_name)
        self._scratch_buffers.append(buf)
        utils.SetUpHiddenBuffer(buf, buf_name)
        with utils.ModifiableScratchBuffer(buf):
            # TODO: The data is encoded in base64, so we need to convert that to the
            # equivalent output of say xxd
            data = msg.get('body', {}).get('data', '')
            utils.SetBufferContents(buf, [
                f'Memory Dump for Reference {memoryReference} Length: {length} bytes'
                f' Offset: {offset}',
                '-' * 80,
                'Offset    Bytes                                             Text',
                '-' * 80,
            ])
            utils.AppendToBuffer(buf, utils.Base64ToHexDump(data))

        utils.SetSyntax('', 'vimspector-memory', buf)
        utils.JumpToWindow(self._window)
        utils.OpenFileInCurrentWindow(buf_name)
Exemple #11
0
  def _UpdateView( self, breakpoint_list, show=True ):
    if show and not self._HasWindow():
      vim.command( f'botright { settings.Int( "bottombar_height" ) }new' )
      self._win = vim.current.window
      if self._HasBuffer():
        with utils.NoAutocommands():
          vim.current.buffer = self._buffer
      else:
        self._buffer = vim.current.buffer
        mappings = settings.Dict( 'mappings' )[ 'breakpoints' ]
        groups = {
          'toggle': 'ToggleBreakpointViewBreakpoint',
          'toggle_all': 'ToggleAllBreakpointsViewBreakpoint',
          'delete': 'DeleteBreakpointViewBreakpoint',
          'jump_to': 'JumpToBreakpointViewBreakpoint',
          'add_line': 'SetAdvancedLineBreakpoint',
          'add_func': 'AddAdvancedFunctionBreakpoint'
        }
        for key, func in groups.items():
          for mapping in utils.GetVimList( mappings, key ):
            vim.command( f'nnoremap <silent> <buffer> { mapping } '
                         ':<C-u>call '
                         f'vimspector#{ func }()<CR>' )
        utils.SetUpHiddenBuffer( self._buffer,
                                 "vimspector.Breakpoints" )

      utils.UpdateSessionWindows( {
        'breakpoints': utils.WindowID( self._win )
      } )

      # set highlighting
      vim.eval( "matchadd( 'WarningMsg', 'ENABLED', 100 )" )
      vim.eval( "matchadd( 'WarningMsg', 'VERIFIED', 100 )" )
      vim.eval( "matchadd( 'LineNr', 'DISABLED', 100 )" )
      vim.eval( "matchadd( 'LineNr', 'PENDING', 100 )" )
      vim.eval( "matchadd( 'Title', '\\v^\\S+:{0,}', 100 )" )

      if utils.UseWinBar():
        vim.command( 'nnoremenu <silent> 1.1 WinBar.Delete '
                     ':call vimspector#DeleteBreakpointViewBreakpoint()<CR>' )
        vim.command( 'nnoremenu <silent> 1.2 WinBar.Toggle '
                     ':call vimspector#ToggleBreakpointViewBreakpoint()<CR>' )
        vim.command( 'nnoremenu <silent> 1.2 WinBar.*Toggle '
                     ':call'
                       ' vimspector#ToggleAllBreakpointsViewBreakpoint()<CR>' )
        vim.command( 'nnoremenu <silent> 1.3 WinBar.Jump\\ To '
                     ':call vimspector#JumpToBreakpointViewBreakpoint()<CR>' )
        # TODO: Add tests for this function
        vim.command( 'nnoremenu <silent> 1.4 WinBar.+Line '
                     ':call vimspector#SetAdvancedLineBreakpoint()<CR>' )
        vim.command( 'nnoremenu <silent> 1.4 WinBar.+Function '
                     ':call vimspector#AddAdvancedFunctionBreakpoint()<CR>' )
        vim.command( 'nnoremenu <silent> 1.4 WinBar.Clear '
                     ':call vimspector#ClearBreakpoints()<CR>' )
        vim.command( 'nnoremenu <silent> 1.4 WinBar.Save '
                     ':call vimspector#WriteSessionFile()<CR>' )
        vim.command( 'nnoremenu <silent> 1.4 WinBar.Load '
                     ':call vimspector#ReadSessionFile()<CR>' )

      # we want to maintain the height of the window
      self._win.options[ "winfixheight" ] = True

    self._breakpoint_list = breakpoint_list

    def FormatEntry( el ):
      prefix = ''
      if el.get( 'type' ) == 'L':
        prefix = '{}:{} '.format( os.path.basename( el.get( 'filename' ) ),
                                  el.get( 'lnum' ) )

      return '{}{}'.format( prefix, el.get( 'text' ) )

    if self._HasBuffer():
      with utils.ModifiableScratchBuffer( self._buffer ):
        with utils.RestoreCursorPosition():
          utils.SetBufferContents( self._buffer,
                                   list( map( FormatEntry, breakpoint_list ) ) )
Exemple #12
0
    def __init__(self, variables_win, watches_win):
        self._logger = logging.getLogger(__name__)
        utils.SetUpLogging(self._logger)

        self._connection = None
        self._current_syntax = ''
        self._server_capabilities = None

        self._variable_eval: Scope = None
        self._variable_eval_view: View = None

        mappings = settings.Dict('mappings')['variables']

        # Set up the "Variables" buffer in the variables_win
        self._scopes: typing.List[Scope] = []
        self._vars = View(variables_win, {}, self._DrawScopes)
        utils.SetUpHiddenBuffer(self._vars.buf, 'vimspector.Variables')
        with utils.LetCurrentWindow(variables_win):
            if utils.UseWinBar():
                vim.command('nnoremenu <silent> 1.1 WinBar.Set '
                            ':call vimspector#SetVariableValue()<CR>')
            AddExpandMappings(mappings)

        # Set up the "Watches" buffer in the watches_win (and create a WinBar in
        # there)
        self._watches: typing.List[Watch] = []
        self._watch = View(watches_win, {}, self._DrawWatches)
        utils.SetUpPromptBuffer(self._watch.buf, 'vimspector.Watches',
                                'Expression: ', 'vimspector#AddWatchPrompt',
                                'vimspector#OmniFuncWatch')
        with utils.LetCurrentWindow(watches_win):
            AddExpandMappings(mappings)
            for mapping in utils.GetVimList(mappings, 'delete'):
                vim.command(
                    f'nnoremap <buffer> { mapping } :call vimspector#DeleteWatch()<CR>'
                )

            if utils.UseWinBar():
                vim.command('nnoremenu <silent> 1.1 WinBar.New '
                            ':call vimspector#AddWatch()<CR>')
                vim.command('nnoremenu <silent> 1.2 WinBar.Expand/Collapse '
                            ':call vimspector#ExpandVariable()<CR>')
                vim.command('nnoremenu <silent> 1.3 WinBar.Delete '
                            ':call vimspector#DeleteWatch()<CR>')
                vim.command('nnoremenu <silent> 1.1 WinBar.Set '
                            ':call vimspector#SetVariableValue()<CR>')

        # Set the (global!) balloon expr if supported
        has_balloon = int(vim.eval("has( 'balloon_eval' )"))
        has_balloon_term = int(vim.eval("has( 'balloon_eval_term' )"))

        self._oldoptions = {}
        if has_balloon or has_balloon_term:
            self._oldoptions = {
                'balloonexpr': vim.options['balloonexpr'],
                'balloondelay': vim.options['balloondelay'],
            }
            vim.options['balloonexpr'] = ("vimspector#internal#"
                                          "balloon#HoverTooltip()")

            vim.options['balloondelay'] = 250

        if has_balloon:
            self._oldoptions['ballooneval'] = vim.options['ballooneval']
            vim.options['ballooneval'] = True

        if has_balloon_term:
            self._oldoptions['balloonevalterm'] = vim.options[
                'balloonevalterm']
            vim.options['balloonevalterm'] = True

        self._is_term = not bool(int(vim.eval("has( 'gui_running' )")))