Patch 8.0.1085
Problem:    The terminal debugger can't set breakpoints.
Solution:   Add :Break and :Delete commands.  Also commands for stepping
            through code.
Files:      runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
            runtime/doc/terminal.txt


*** ../vim-8.0.1084/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim        
2017-09-08 20:49:47.620907422 +0200
--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim        2017-09-09 
22:18:08.690593267 +0200
***************
*** 20,37 ****
  command -nargs=* -complete=file Termdebug call s:StartDebug(<q-args>)
  
  " Name of the gdb command, defaults to "gdb".
! if !exists('debugger')
!   let debugger = 'gdb'
  endif
  
  " Sign used to highlight the line where the program has stopped.
  sign define debugPC linehl=debugPC
  if &background == 'light'
!   hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
  else
!   hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
  endif
! let s:pc_id = 12
  
  func s:StartDebug(cmd)
    let s:startwin = win_getid(winnr())
--- 20,45 ----
  command -nargs=* -complete=file Termdebug call s:StartDebug(<q-args>)
  
  " Name of the gdb command, defaults to "gdb".
! if !exists('termdebugger')
!   let termdebugger = 'gdb'
  endif
  
  " Sign used to highlight the line where the program has stopped.
+ " There can be only one.
  sign define debugPC linehl=debugPC
+ let s:pc_id = 12
+ let s:break_id = 13
+ 
+ " Sign used to indicate a breakpoint.
+ " Can be used multiple times.
+ sign define debugBreakpoint text=>> texthl=debugBreakpoint
+ 
  if &background == 'light'
!   hi default debugPC term=reverse ctermbg=lightblue guibg=lightblue
  else
!   hi default debugPC term=reverse ctermbg=darkblue guibg=darkblue
  endif
! hi default debugBreakpoint term=reverse ctermbg=red guibg=red
  
  func s:StartDebug(cmd)
    let s:startwin = win_getid(winnr())
***************
*** 61,67 ****
    let commpty = job_info(term_getjob(s:commbuf))['tty_out']
  
    " Open a terminal window to run the debugger.
!   let cmd = [g:debugger, '-tty', pty, a:cmd]
    echomsg 'executing "' . join(cmd) . '"'
    let gdbbuf = term_start(cmd, {
        \ 'exit_cb': function('s:EndDebug'),
--- 69,75 ----
    let commpty = job_info(term_getjob(s:commbuf))['tty_out']
  
    " Open a terminal window to run the debugger.
!   let cmd = [g:termdebugger, '-tty', pty, a:cmd]
    echomsg 'executing "' . join(cmd) . '"'
    let gdbbuf = term_start(cmd, {
        \ 'exit_cb': function('s:EndDebug'),
***************
*** 76,87 ****
  
    " Connect gdb to the communication pty, using the GDB/MI interface
    call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r")
  endfunc
  
  func s:EndDebug(job, status)
    exe 'bwipe! ' . s:ptybuf
    exe 'bwipe! ' . s:commbuf
!   call setwinvar(s:startwin, '&signcolumn', s:startsigncolumn)
  endfunc
  
  " Handle a message received from gdb on the GDB/MI interface.
--- 84,107 ----
  
    " Connect gdb to the communication pty, using the GDB/MI interface
    call term_sendkeys(gdbbuf, 'new-ui mi ' . commpty . "\r")
+ 
+   " Install debugger commands.
+   call s:InstallCommands()
+ 
+   let s:breakpoints = {}
  endfunc
  
  func s:EndDebug(job, status)
    exe 'bwipe! ' . s:ptybuf
    exe 'bwipe! ' . s:commbuf
! 
!   let curwinid = win_getid(winnr())
! 
!   call win_gotoid(s:startwin)
!   let &signcolumn = s:startsigncolumn
!   call s:DeleteCommands()
! 
!   call win_gotoid(curwinid)
  endfunc
  
  " Handle a message received from gdb on the GDB/MI interface.
***************
*** 95,128 ****
      endif
      if msg != ''
        if msg =~ '^\*\(stopped\|running\)'
!       let wid = win_getid(winnr())
  
!       if win_gotoid(s:startwin)
!         if msg =~ '^\*stopped'
!           " TODO: proper parsing
!           let fname = substitute(msg, '.*fullname="\([^"]*\)".*', '\1', '')
!           let lnum = substitute(msg, '.*line="\([^"]*\)".*', '\1', '')
!           if lnum =~ '^[0-9]*$'
!             if expand('%:h') != fname
!               if &modified
!                 " TODO: find existing window
!                 exe 'split ' . fnameescape(fname)
!                 let s:startwin = win_getid(winnr())
!               else
!                 exe 'edit ' . fnameescape(fname)
!               endif
!             endif
!             exe lnum
!             exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC 
file=' . fnameescape(fname)
!             setlocal signcolumn=yes
!           endif
          else
!           exe 'sign unplace ' . s:pc_id
          endif
- 
-         call win_gotoid(wid)
        endif
        endif
      endif
!   endfor
  endfunc
--- 115,238 ----
      endif
      if msg != ''
        if msg =~ '^\*\(stopped\|running\)'
!       call s:HandleCursor(msg)
!       elseif msg =~ '^\^done,bkpt='
!       call s:HandleNewBreakpoint(msg)
!       elseif msg =~ '^=breakpoint-deleted,'
!       call s:HandleBreakpointDelete(msg)
!       endif
!     endif
!   endfor
! endfunc
! 
! " Install commands in the current window to control the debugger.
! func s:InstallCommands()
!   command Break call s:SetBreakpoint()
!   command Delete call s:DeleteBreakpoint()
!   command Step call s:SendCommand('-exec-step')
!   command NNext call s:SendCommand('-exec-next')
!   command Finish call s:SendCommand('-exec-finish')
!   command Continue call s:SendCommand('-exec-continue')
! endfunc
! 
! " Delete installed debugger commands in the current window.
! func s:DeleteCommands()
!   delcommand Break
!   delcommand Delete
!   delcommand Step
!   delcommand NNext
!   delcommand Finish
!   delcommand Continue
! endfunc
! 
! " :Break - Set a breakpoint at the cursor position.
! func s:SetBreakpoint()
!   call term_sendkeys(s:commbuf, '-break-insert --source '
!       \ . fnameescape(expand('%:p')) . ' --line ' . line('.') . "\r")
! endfunc
! 
! " :Delete - Delete a breakpoint at the cursor position.
! func s:DeleteBreakpoint()
!   let fname = fnameescape(expand('%:p'))
!   let lnum = line('.')
!   for [key, val] in items(s:breakpoints)
!     if val['fname'] == fname && val['lnum'] == lnum
!       call term_sendkeys(s:commbuf, '-break-delete ' . key . "\r")
!       " Assume this always wors, the reply is simply "^done".
!       exe 'sign unplace ' . (s:break_id + key)
!       unlet s:breakpoints[key]
!       break
!     endif
!   endfor
! endfunc
! 
! " :Next, :Continue, etc - send a command to gdb
! func s:SendCommand(cmd)
!   call term_sendkeys(s:commbuf, a:cmd . "\r")
! endfunc
  
! " Handle stopping and running message from gdb.
! " Will update the sign that shows the current position.
! func s:HandleCursor(msg)
!   let wid = win_getid(winnr())
! 
!   if win_gotoid(s:startwin)
!     if a:msg =~ '^\*stopped'
!       let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
!       let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
!       if lnum =~ '^[0-9]*$'
!       if expand('%:h') != fname
!         if &modified
!           " TODO: find existing window
!           exe 'split ' . fnameescape(fname)
!           let s:startwin = win_getid(winnr())
          else
!           exe 'edit ' . fnameescape(fname)
          endif
        endif
+       exe lnum
+       exe 'sign place ' . s:pc_id . ' line=' . lnum . ' name=debugPC file=' . 
fnameescape(fname)
+       setlocal signcolumn=yes
        endif
+     else
+       exe 'sign unplace ' . s:pc_id
      endif
! 
!     call win_gotoid(wid)
!   endif
! endfunc
! 
! " Handle setting a breakpoint
! " Will update the sign that shows the breakpoint
! func s:HandleNewBreakpoint(msg)
!   let nr = substitute(a:msg, '.*number="\([0-9]\)*\".*', '\1', '') + 0
!   if nr == 0
!     return
!   endif
! 
!   if has_key(s:breakpoints, nr)
!     let entry = s:breakpoints[nr]
!   else
!     let entry = {}
!     let s:breakpoints[nr] = entry
!   endif
! 
!   let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
!   let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
! 
!   exe 'sign place ' . (s:break_id + nr) . ' line=' . lnum . ' 
name=debugBreakpoint file=' . fnameescape(fname)
! 
!   let entry['fname'] = fname
!   let entry['lnum'] = lnum
! endfunc
! 
! " Handle deleting a breakpoint
! " Will remove the sign that shows the breakpoint
! func s:HandleBreakpointDelete(msg)
!   let nr = substitute(a:msg, '.*id="\([0-9]*\)\".*', '\1', '') + 0
!   if nr == 0
!     return
!   endif
!   exe 'sign unplace ' . (s:break_id + nr)
!   unlet s:breakpoints[nr]
  endfunc
*** ../vim-8.0.1084/runtime/doc/terminal.txt    2017-09-02 16:28:32.998776571 
+0200
--- runtime/doc/terminal.txt    2017-09-09 22:14:20.516113480 +0200
***************
*** 1,4 ****
! *terminal.txt*        For Vim version 8.0.  Last change: 2017 Aug 29
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
--- 1,4 ----
! *terminal.txt*        For Vim version 8.0.  Last change: 2017 Sep 09
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
***************
*** 30,40 ****
  started connected to the terminal emulator. For example, to run a shell: >
       :term bash
  
! Or to run a debugger: >
!      :term gdb vim
  
  The job runs asynchronously from Vim, the window will be updated to show
! output from the job, also  while editing in any other window.
  
  
  Typing ~
--- 30,40 ----
  started connected to the terminal emulator. For example, to run a shell: >
       :term bash
  
! Or to run build command: >
!      :term make myprogram
  
  The job runs asynchronously from Vim, the window will be updated to show
! output from the job, also while editing in another window.
  
  
  Typing ~
***************
*** 109,115 ****
  
                        If [range] is given the specified lines are used as
                        input for the job.  It will not be possible to type
!                       keys in the terminal window.
  
                        Two comma separated numbers are used as "rows,cols".
                        E.g. `:24,80gdb` opens a terminal with 24 rows and 80
--- 109,116 ----
  
                        If [range] is given the specified lines are used as
                        input for the job.  It will not be possible to type
!                       keys in the terminal window.  For MS-Windows see the
!                       ++eof argument below.
  
                        Two comma separated numbers are used as "rows,cols".
                        E.g. `:24,80gdb` opens a terminal with 24 rows and 80
***************
*** 133,146 ****
                                        height.
                        ++cols={width}  Use {width} for the terminal window
                                        width.
!                       ++eof={text}    when using [range], text to send after
!                                       the last line was written. The default
!                                       is to send CTRL-D.  A CR is appended.
                                        E.g. for a shell use "++eof=exit" and
                                        for Python "++eof=exit()".  Special
                                        codes can be used like with `:map`,
                                        e.g. "<C-Z>" for CTRL-Z.
-                                       {only on MS-Windows}
  
                        If you want to use more options use the |term_start()|
                        function.
--- 134,148 ----
                                        height.
                        ++cols={width}  Use {width} for the terminal window
                                        width.
!                       ++eof={text}    when using [range]: text to send after
!                                       the last line was written. Cannot
!                                       contain white space.  A CR is
!                                       appended.  For MS-Windows the default
!                                       is to send CTRL-D.
                                        E.g. for a shell use "++eof=exit" and
                                        for Python "++eof=exit()".  Special
                                        codes can be used like with `:map`,
                                        e.g. "<C-Z>" for CTRL-Z.
  
                        If you want to use more options use the |term_start()|
                        function.
***************
*** 303,335 ****
  3. Debugging                                  *terminal-debug*
  
  The Terminal debugging plugin can be used to debug a program with gdb and view
! the source code in a Vim window.
  
  Load the plugin with this command: >
        packadd termdebug
! 
  To start debugging use `:TermDebug` folowed by the command name, for example: 
>
        :TermDebug vim
  
  This opens two windows:
  - A terminal window in which "gdb vim" is executed.  Here you can directly
!   interact with gdb.
  - A terminal window for the executed program.  When "run" is used in gdb the
    program I/O will happen in this window, so that it does not interfere with
!   controlling gdb.
! The current window is used to show the source code.  When gdb jumps to a
! source file location this window will display the code, if possible.  Values
! of variables can be inspected, breakpoints set and cleared, etc.
  
  When the debugger ends the two opened windows are closed.
  
  
  Customizing ~
  
! g:debugger    The debugger command.  Default "gdb".
  
  
! TODO
  
  
   vim:tw=78:ts=8:ft=help:norl:
--- 305,394 ----
  3. Debugging                                  *terminal-debug*
  
  The Terminal debugging plugin can be used to debug a program with gdb and view
! the source code in a Vim window.  Since this is completely contained inside
! Vim this also works remotely over an ssh connection.
! 
! 
! Starting ~
  
  Load the plugin with this command: >
        packadd termdebug
! <                                                     *:Termdebug*
  To start debugging use `:TermDebug` folowed by the command name, for example: 
>
        :TermDebug vim
  
  This opens two windows:
  - A terminal window in which "gdb vim" is executed.  Here you can directly
!   interact with gdb.  The buffer name is "!gdb".
  - A terminal window for the executed program.  When "run" is used in gdb the
    program I/O will happen in this window, so that it does not interfere with
!   controlling gdb.  The buffer name is "gdb program".
! 
! The current window is used to show the source code.  When gdb pauses the
! source file location will be displayed, if possible.  A sign is used to
! highlight the current position (using highlight group debugPC).        
! 
! If the buffer in the current window is modified, another window will be opened
! to display the current gdb position.
! 
! Focus the terminal of the executed program to interact with it.  This works
! the same as any command running in a terminal window.
  
  When the debugger ends the two opened windows are closed.
  
  
+ Stepping through code ~
+ 
+ Put focus on the gdb window to type commands there.  Some common ones are:
+ - CTRL-C    interrupt the program
+ - next      execute the current line and stop at the next line
+ - step      execute the current line and stop at the next statement, entering
+           functions
+ - finish    execute until leaving the current function
+ - where     show the stack
+ - frame N   go to the Nth stack frame
+ - continue  continue execution
+ 
+ In the window showing the source code some commands can passed to gdb:
+ - Break     set a breakpoint at the current line; a sign will be displayed
+ - Delete    delete a breakpoint at the current line
+ - Step            execute the gdb "step" command
+ - NNext           execute the gdb "next" command (:Next is a Vim command)
+ - Finish    execute the gdb "finish" command
+ - Continue  execute the gdb "continue" command
+ 
+ 
+ Communication ~
+ 
+ There is another, hidden, buffer, which is used for Vim to communicate with
+ gdb.  The buffer name is "gdb communication".  Do not delete this buffer, it
+ will break the debugger.
+ 
+ 
  Customizing ~
  
! To change the name of the gdb command, set the "termdebugger" variable before
! invoking `:Termdebug`: >
!       let termdebugger = "mygdb"
! Only debuggers fully compatible with gdb will work.  Vim uses the GDB/MI
! interface.
! 
! The color of the signs can be adjusted with these highlight groups:
! - debugPC             the current position
! - debugBreakpoint     a breakpoint
! 
! The defaults are, when 'background' is "light":
!   hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
!   hi debugBreakpoint term=reverse ctermbg=red guibg=red
! 
! When 'background' is "dark":
!   hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
!   hi debugBreakpoint term=reverse ctermbg=red guibg=red
! 
  
+ NOT WORKING YET: ~
  
! Values of variables can be inspected, etc.
  
  
   vim:tw=78:ts=8:ft=help:norl:
*** ../vim-8.0.1084/src/version.c       2017-09-09 18:45:20.418225738 +0200
--- src/version.c       2017-09-09 22:16:01.311441928 +0200
***************
*** 771,772 ****
--- 771,774 ----
  {   /* Add new patch number below this line */
+ /**/
+     1085,
  /**/

-- 
I AM THANKFUL...
...for the piles of laundry and ironing because it means I
have plenty of clothes to wear.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui