Patch 8.1.0071
Problem: Terminal debugger only works with the terminal feature.
Solution: Make it also work with a prompt buffer. Makes it possible to use
on MS-Windows. Various other improvements. (closes #3012)
Files: runtime/doc/terminal.txt,
runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
*** ../vim-8.1.0070/runtime/doc/terminal.txt 2018-06-12 18:04:28.034267877
+0200
--- runtime/doc/terminal.txt 2018-06-17 21:33:43.206011529 +0200
***************
*** 38,43 ****
--- 38,44 ----
Stepping through code |termdebug-stepping|
Inspecting variables |termdebug-variables|
Other commands |termdebug-commands|
+ Prompt mode |termdebug-prompt|
Communication |termdebug-communication|
Customizing |termdebug-customizing|
***************
*** 620,625 ****
--- 621,630 ----
the source code in a Vim window. Since this is completely contained inside
Vim this also works remotely over an ssh connection.
+ When the |+terminal| feature is missing, the plugin will use the "prompt"
+ buffer type, if possible. The running program will then use a newly opened
+ terminal window. See |termdebug-prompt| below for details.
+
Starting ~
*termdebug-starting*
***************
*** 799,804 ****
--- 804,826 ----
isn't one
+ Prompt mode ~
+ *termdebug-prompt*
+ When the |+terminal| feature is not supported and on MS-Windows, gdb will run
+ in a buffer with 'buftype' set to "prompt". This works slightly differently:
+ - The gdb window will be in Insert mode while typing commands. Go to Normal
+ mode with <Esc>, then you can move around in the buffer, copy/paste, etc.
+ Go back to editing the gdb command with any command that starts Insert mode,
+ such as `a` or `i`.
+ - The program being debugged will run in a separate window. On MS-Windows
+ this is a new console window. On Unix, if the |+terminal| feature is
+ available a Terminal window will be opened to run the debugged program in.
+
+ *termdebug_use_prompt*
+ Prompt mode can be used even when the |+terminal| feature is present with: >
+ let g:termdebug_use_prompt = 1
+
+
Communication ~
*termdebug-communication*
There is another, hidden, buffer, which is used for Vim to communicate with
***************
*** 836,841 ****
--- 858,871 ----
hi debugBreakpoint term=reverse ctermbg=red guibg=red
+ Shorcuts *termdebug_shortcuts*
+
+ You can define your own shortcuts (mappings) to control gdb, that can work in
+ any window, using the TermDebugSendCommand() function. Example: >
+ map ,w :call TermDebugSendCommand('where')<CR>
+ The argument is the gdb command.
+
+
Popup menu *termdebug_popup*
By default the Termdebug plugin sets 'mousemodel' to "popup_setpos" and adds
*** ../vim-8.1.0070/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
2018-04-16 16:16:51.000000000 +0200
--- runtime/pack/dist/opt/termdebug/plugin/termdebug.vim 2018-06-17
21:27:00.040243063 +0200
***************
*** 1,27 ****
" Debugger plugin using gdb.
"
! " WORK IN PROGRESS - much doesn't work yet
"
! " Open two visible terminal windows:
! " 1. run a pty, as with ":term NONE"
! " 2. run gdb, passing the pty
! " The current window is used to view source code and follows gdb.
"
" A third terminal window is hidden, it is used for communication with gdb.
"
" The communication with gdb uses GDB/MI. See:
" https://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html
- "
- " Author: Bram Moolenaar
- " Copyright: Vim license applies, see ":help license"
! " In case this gets loaded twice.
if exists(':Termdebug')
finish
endif
! " Uncomment this line to write logging in "debuglog".
! " call ch_logfile('debuglog', 'w')
" The command that starts debugging, e.g. ":Termdebug vim".
" To end type "quit" in the gdb window.
--- 1,60 ----
" Debugger plugin using gdb.
"
! " Author: Bram Moolenaar
! " Copyright: Vim license applies, see ":help license"
! " Last Update: 2018 Jun 3
! "
! " WORK IN PROGRESS - Only the basics work
! " Note: On MS-Windows you need a recent version of gdb. The one included with
! " MingW is too old (7.6.1).
! " I used version 7.12 from http://www.equation.com/servlet/equation.cmd?fa=gdb
! "
! " There are two ways to run gdb:
! " - In a terminal window; used if possible, does not work on MS-Windows
! " Not used when g:termdebug_use_prompt is set to 1.
! " - Using a "prompt" buffer; may use a terminal window for the program
"
! " For both the current window is used to view source code and shows the
! " current statement from gdb.
"
+ " USING A TERMINAL WINDOW
+ "
+ " Opens two visible terminal windows:
+ " 1. runs a pty for the debugged program, as with ":term NONE"
+ " 2. runs gdb, passing the pty of the debugged program
" A third terminal window is hidden, it is used for communication with gdb.
"
+ " USING A PROMPT BUFFER
+ "
+ " Opens a window with a prompt buffer to communicate with gdb.
+ " Gdb is run as a job with callbacks for I/O.
+ " On Unix another terminal window is opened to run the debugged program
+ " On MS-Windows a separate console is opened to run the debugged program
+ "
" The communication with gdb uses GDB/MI. See:
" https://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html
! " In case this gets sourced twice.
if exists(':Termdebug')
finish
endif
! " Need either the +terminal feature or +channel and the prompt buffer.
! " The terminal feature does not work with gdb on win32.
! if has('terminal') && !has('win32')
! let s:way = 'terminal'
! elseif has('channel') && exists('*prompt_setprompt')
! let s:way = 'prompt'
! else
! if has('terminal')
! let s:err = 'Cannot debug, missing prompt buffer support'
! else
! let s:err = 'Cannot debug, +channel feature is not supported'
! endif
! command -nargs=* -complete=file -bang Termdebug echoerr s:err
! command -nargs=+ -complete=file -bang TermdebugCommand echoerr s:err
! finish
! endif
" The command that starts debugging, e.g. ":Termdebug vim".
" To end type "quit" in the gdb window.
***************
*** 59,66 ****
echoerr 'Terminal debugger already running'
return
endif
! let s:startwin = win_getid(winnr())
let s:startsigncolumn = &signcolumn
let s:save_columns = 0
--- 92,103 ----
echoerr 'Terminal debugger already running'
return
endif
+ let s:ptywin = 0
! " Uncomment this line to write logging in "debuglog".
! " call ch_logfile('debuglog', 'w')
!
! let s:sourcewin = win_getid(winnr())
let s:startsigncolumn = &signcolumn
let s:save_columns = 0
***************
*** 69,83 ****
let s:save_columns = &columns
let &columns = g:termdebug_wide
endif
! let vertical = 1
else
! let vertical = 0
endif
! " Open a terminal window without a job, to run the debugged program
let s:ptybuf = term_start('NONE', {
! \ 'term_name': 'gdb program',
! \ 'vertical': vertical,
\ })
if s:ptybuf == 0
echoerr 'Failed to open the program terminal window'
--- 106,136 ----
let s:save_columns = &columns
let &columns = g:termdebug_wide
endif
! let s:vertical = 1
! else
! let s:vertical = 0
! endif
!
! " Override using a terminal window by setting g:termdebug_use_prompt to 1.
! let use_prompt = exists('g:termdebug_use_prompt') && g:termdebug_use_prompt
! if has('terminal') && !has('win32') && !use_prompt
! let s:way = 'terminal'
else
! let s:way = 'prompt'
endif
! if s:way == 'prompt'
! call s:StartDebug_prompt(a:dict)
! else
! call s:StartDebug_term(a:dict)
! endif
! endfunc
!
! func s:StartDebug_term(dict)
! " Open a terminal window without a job, to run the debugged program in.
let s:ptybuf = term_start('NONE', {
! \ 'term_name': 'debugged program',
! \ 'vertical': s:vertical,
\ })
if s:ptybuf == 0
echoerr 'Failed to open the program terminal window'
***************
*** 85,91 ****
endif
let pty = job_info(term_getjob(s:ptybuf))['tty_out']
let s:ptywin = win_getid(winnr())
! if vertical
" Assuming the source code window will get a signcolumn, use two more
" columns for that, thus one less for the terminal window.
exe (&columns / 2 - 1) . "wincmd |"
--- 138,144 ----
endif
let pty = job_info(term_getjob(s:ptybuf))['tty_out']
let s:ptywin = win_getid(winnr())
! if s:vertical
" Assuming the source code window will get a signcolumn, use two more
" columns for that, thus one less for the terminal window.
exe (&columns / 2 - 1) . "wincmd |"
***************
*** 110,118 ****
let proc_args = get(a:dict, 'proc_args', [])
let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
! echomsg 'executing "' . join(cmd) . '"'
let s:gdbbuf = term_start(cmd, {
! \ 'exit_cb': function('s:EndDebug'),
\ 'term_finish': 'close',
\ })
if s:gdbbuf == 0
--- 163,171 ----
let proc_args = get(a:dict, 'proc_args', [])
let cmd = [g:termdebugger, '-quiet', '-tty', pty] + gdb_args
! call ch_log('executing "' . join(cmd) . '"')
let s:gdbbuf = term_start(cmd, {
! \ 'exit_cb': function('s:EndTermDebug'),
\ 'term_finish': 'close',
\ })
if s:gdbbuf == 0
***************
*** 166,176 ****
" exec-interrupt, since many commands don't work properly while the target
is
" running.
call s:SendCommand('-gdb-set mi-async on')
" Disable pagination, it causes everything to stop at the gdb
" "Type <return> to continue" prompt.
! call s:SendCommand('-gdb-set pagination off')
" Sign used to highlight the line where the program has stopped.
" There can be only one.
sign define debugPC linehl=debugPC
--- 219,326 ----
" exec-interrupt, since many commands don't work properly while the target
is
" running.
call s:SendCommand('-gdb-set mi-async on')
+ " Older gdb uses a different command.
+ call s:SendCommand('-gdb-set target-async on')
" Disable pagination, it causes everything to stop at the gdb
" "Type <return> to continue" prompt.
! call s:SendCommand('set pagination off')
!
! call s:StartDebugCommon(a:dict)
! endfunc
!
! func s:StartDebug_prompt(dict)
! " Open a window with a prompt buffer to run gdb in.
! if s:vertical
! vertical new
! else
! new
! endif
! let s:gdbwin = win_getid(winnr())
! let s:promptbuf = bufnr('')
! call prompt_setprompt(s:promptbuf, 'gdb> ')
! set buftype=prompt
! file gdb
! call prompt_setcallback(s:promptbuf, function('s:PromptCallback'))
! call prompt_setinterrupt(s:promptbuf, function('s:PromptInterrupt'))
+ if s:vertical
+ " Assuming the source code window will get a signcolumn, use two more
+ " columns for that, thus one less for the terminal window.
+ exe (&columns / 2 - 1) . "wincmd |"
+ endif
+
+ " Add -quiet to avoid the intro message causing a hit-enter prompt.
+ let gdb_args = get(a:dict, 'gdb_args', [])
+ let proc_args = get(a:dict, 'proc_args', [])
+
+ let cmd = [g:termdebugger, '-quiet', '--interpreter=mi2'] + gdb_args
+ call ch_log('executing "' . join(cmd) . '"')
+
+ let s:gdbjob = job_start(cmd, {
+ \ 'exit_cb': function('s:EndPromptDebug'),
+ \ 'out_cb': function('s:GdbOutCallback'),
+ \ })
+ if job_status(s:gdbjob) != "run"
+ echoerr 'Failed to start gdb'
+ exe 'bwipe! ' . s:promptbuf
+ return
+ endif
+ let s:gdb_channel = job_getchannel(s:gdbjob)
+
+ " Interpret commands while the target is running. This should usualy only
+ " be exec-interrupt, since many commands don't work properly while the
+ " target is running.
+ call s:SendCommand('-gdb-set mi-async on')
+ " Older gdb uses a different command.
+ call s:SendCommand('-gdb-set target-async on')
+
+ let s:ptybuf = 0
+ if has('win32')
+ " MS-Windows: run in a new console window for maximum compatibility
+ call s:SendCommand('set new-console on')
+ elseif has('terminal')
+ " Unix: Run the debugged program in a terminal window. Open it below the
+ " gdb window.
+ belowright let s:ptybuf = term_start('NONE', {
+ \ 'term_name': 'debugged program',
+ \ })
+ if s:ptybuf == 0
+ echoerr 'Failed to open the program terminal window'
+ call job_stop(s:gdbjob)
+ return
+ endif
+ let s:ptywin = win_getid(winnr())
+ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ call s:SendCommand('tty ' . pty)
+
+ " Since GDB runs in a prompt window, the environment has not been set to
+ " match a terminal window, need to do that now.
+ call s:SendCommand('set env TERM = xterm-color')
+ call s:SendCommand('set env ROWS = ' . winheight(s:ptywin))
+ call s:SendCommand('set env LINES = ' . winheight(s:ptywin))
+ call s:SendCommand('set env COLUMNS = ' . winwidth(s:ptywin))
+ call s:SendCommand('set env COLORS = ' . &t_Co)
+ call s:SendCommand('set env VIM_TERMINAL = ' . v:version)
+ else
+ " TODO: open a new terminal get get the tty name, pass on to gdb
+ call s:SendCommand('show inferior-tty')
+ endif
+ call s:SendCommand('set print pretty on')
+ call s:SendCommand('set breakpoint pending on')
+ " Disable pagination, it causes everything to stop at the gdb
+ call s:SendCommand('set pagination off')
+
+ " Set arguments to be run
+ if len(proc_args)
+ call s:SendCommand('set args ' . join(proc_args))
+ endif
+
+ call s:StartDebugCommon(a:dict)
+ startinsert
+ endfunc
+
+ func s:StartDebugCommon(dict)
" Sign used to highlight the line where the program has stopped.
" There can be only one.
sign define debugPC linehl=debugPC
***************
*** 180,186 ****
sign define debugBreakpoint text=>> texthl=debugBreakpoint
" Install debugger commands in the text window.
! call win_gotoid(s:startwin)
call s:InstallCommands()
call win_gotoid(s:gdbwin)
--- 330,336 ----
sign define debugBreakpoint text=>> texthl=debugBreakpoint
" Install debugger commands in the text window.
! call win_gotoid(s:sourcewin)
call s:InstallCommands()
call win_gotoid(s:gdbwin)
***************
*** 202,228 ****
au BufUnload * call s:BufUnloaded()
augroup END
! " Run the command if the bang attribute was given
! " and got to the window
if get(a:dict, 'bang', 0)
call s:SendCommand('-exec-run')
call win_gotoid(s:ptywin)
endif
endfunc
! func s:EndDebug(job, status)
! exe 'bwipe! ' . s:ptybuf
exe 'bwipe! ' . s:commbuf
unlet s:gdbwin
let curwinid = win_getid(winnr())
! call win_gotoid(s:startwin)
let &signcolumn = s:startsigncolumn
call s:DeleteCommands()
call win_gotoid(curwinid)
if s:save_columns > 0
let &columns = s:save_columns
endif
--- 352,481 ----
au BufUnload * call s:BufUnloaded()
augroup END
! " Run the command if the bang attribute was given and got to the debug
! " window.
if get(a:dict, 'bang', 0)
call s:SendCommand('-exec-run')
call win_gotoid(s:ptywin)
endif
+ endfunc
+
+ " Send a command to gdb. "cmd" is the string without line terminator.
+ func s:SendCommand(cmd)
+ call ch_log('sending to gdb: ' . a:cmd)
+ if s:way == 'prompt'
+ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
+ else
+ call term_sendkeys(s:commbuf, a:cmd . "\r")
+ endif
+ endfunc
+
+ " This is global so that a user can create their mappings with this.
+ func TermDebugSendCommand(cmd)
+ if s:way == 'prompt'
+ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
+ else
+ let do_continue = 0
+ if !s:stopped
+ let do_continue = 1
+ call s:SendCommand('-exec-interrupt')
+ sleep 10m
+ endif
+ call term_sendkeys(s:gdbbuf, a:cmd . "\r")
+ if do_continue
+ Continue
+ endif
+ endif
+ endfunc
+
+ " Function called when entering a line in the prompt buffer.
+ func s:PromptCallback(text)
+ call s:SendCommand(a:text)
+ endfunc
+
+ " Function called when pressing CTRL-C in the prompt buffer.
+ func s:PromptInterrupt()
+ call ch_log('Interrupting gdb')
+ call job_stop(s:gdbjob, 'int')
+ endfunc
+
+ " Function called when gdb outputs text.
+ func s:GdbOutCallback(channel, text)
+ call ch_log('received from gdb: ' . a:text)
+
+ " Drop the gdb prompt, we have our own.
+ " Drop status and echo'd commands.
+ if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&' || a:text[0]
== '='
+ return
+ endif
+ if a:text =~ '^^error,msg='
+ let text = s:DecodeMessage(a:text[11:])
+ if exists('s:evalexpr') && text =~ 'A syntax error in expression,
near\|No symbol .* in current context'
+ " Silently drop evaluation errors.
+ unlet s:evalexpr
+ return
+ endif
+ elseif a:text[0] == '~'
+ let text = s:DecodeMessage(a:text[1:])
+ else
+ call s:CommOutput(a:channel, a:text)
+ return
+ endif
+ let curwinid = win_getid(winnr())
+ call win_gotoid(s:gdbwin)
+
+ " Add the output above the current prompt.
+ call append(line('$') - 1, text)
+ set nomodified
+
+ call win_gotoid(curwinid)
endfunc
! " Decode a message from gdb. quotedText starts with a ", return the text up
! " to the next ", unescaping characters.
! func s:DecodeMessage(quotedText)
! if a:quotedText[0] != '"'
! echoerr 'DecodeMessage(): missing quote'
! return
! endif
! let result = ''
! let i = 1
! while a:quotedText[i] != '"' && i < len(a:quotedText)
! if a:quotedText[i] == '\'
! let i += 1
! if a:quotedText[i] == 'n'
! " drop \n
! let i += 1
! continue
! endif
! endif
! let result .= a:quotedText[i]
! let i += 1
! endwhile
! return result
! endfunc
!
! func s:EndTermDebug(job, status)
exe 'bwipe! ' . s:commbuf
unlet s:gdbwin
+ call s:EndDebugCommon()
+ endfunc
+
+ func s:EndDebugCommon()
let curwinid = win_getid(winnr())
! if exists('s:ptybuf') && s:ptybuf
! exe 'bwipe! ' . s:ptybuf
! endif
!
! call win_gotoid(s:sourcewin)
let &signcolumn = s:startsigncolumn
call s:DeleteCommands()
call win_gotoid(curwinid)
+
if s:save_columns > 0
let &columns = s:save_columns
endif
***************
*** 240,245 ****
--- 493,511 ----
au! TermDebug
endfunc
+ func s:EndPromptDebug(job, status)
+ let curwinid = win_getid(winnr())
+ call win_gotoid(s:gdbwin)
+ close
+ if curwinid != s:gdbwin
+ call win_gotoid(curwinid)
+ endif
+
+ call s:EndDebugCommon()
+ unlet s:gdbwin
+ call ch_log("Returning from EndPromptDebug()")
+ endfunc
+
" Handle a message received from gdb on the GDB/MI interface.
func s:CommOutput(chan, msg)
let msgs = split(a:msg, "\r")
***************
*** 275,285 ****
command -nargs=* Run call s:Run(<q-args>)
command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . <q-args>)
command Stop call s:SendCommand('-exec-interrupt')
! command Continue call s:SendCommand('-exec-continue')
command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
command Gdb call win_gotoid(s:gdbwin)
command Program call win_gotoid(s:ptywin)
! command Source call s:GotoStartwinOrCreateIt()
command Winbar call s:InstallWinbar()
" TODO: can the K mapping be restored?
--- 541,558 ----
command -nargs=* Run call s:Run(<q-args>)
command -nargs=* Arguments call s:SendCommand('-exec-arguments ' . <q-args>)
command Stop call s:SendCommand('-exec-interrupt')
!
! " using -exec-continue results in CTRL-C in gdb window not working
! if s:way == 'prompt'
! command Continue call s:SendCommand('continue')
! else
! command Continue call term_sendkeys(s:gdbbuf, "continue\r")
! endif
!
command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
command Gdb call win_gotoid(s:gdbwin)
command Program call win_gotoid(s:ptywin)
! command Source call s:GotoSourcewinOrCreateIt()
command Winbar call s:InstallWinbar()
" TODO: can the K mapping be restored?
***************
*** 375,381 ****
let do_continue = 0
if !s:stopped
let do_continue = 1
! call s:SendCommand('-exec-interrupt')
sleep 10m
endif
call s:SendCommand('-break-insert --source '
--- 648,660 ----
let do_continue = 0
if !s:stopped
let do_continue = 1
! if s:way == 'prompt'
! " Need to send a signal to get the UI to listen. Strangely this is only
! " needed once.
! call job_stop(s:gdbjob, 'int')
! else
! call s:SendCommand('-exec-interrupt')
! endif
sleep 10m
endif
call s:SendCommand('-break-insert --source '
***************
*** 391,397 ****
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]
--- 670,676 ----
let lnum = line('.')
for [key, val] in items(s:breakpoints)
if val['fname'] == fname && val['lnum'] == lnum
! call s:SendCommand('-break-delete ' . key)
" Assume this always wors, the reply is simply "^done".
exe 'sign unplace ' . (s:break_id + key)
unlet s:breakpoints[key]
***************
*** 400,410 ****
endfor
endfunc
- " :Next, :Continue, etc - send a command to gdb
- func s:SendCommand(cmd)
- call term_sendkeys(s:commbuf, a:cmd . "\r")
- endfunc
-
func s:Run(args)
if a:args != ''
call s:SendCommand('-exec-arguments ' . a:args)
--- 679,684 ----
***************
*** 466,472 ****
" Show a balloon with information of the variable under the mouse pointer,
" if there is any.
func TermDebugBalloonExpr()
! if v:beval_winid != s:startwin
return
endif
let s:evalFromBalloonExpr = 1
--- 740,751 ----
" Show a balloon with information of the variable under the mouse pointer,
" if there is any.
func TermDebugBalloonExpr()
! if v:beval_winid != s:sourcewin
! return
! endif
! if !s:stopped
! " Only evaluate when stopped, otherwise setting a breakpoint using the
! " mouse triggers a balloon.
return
endif
let s:evalFromBalloonExpr = 1
***************
*** 487,496 ****
echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
endfunc
! func s:GotoStartwinOrCreateIt()
! if !win_gotoid(s:startwin)
new
! let s:startwin = win_getid(winnr())
call s:InstallWinbar()
endif
endfunc
--- 766,775 ----
echoerr substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
endfunc
! func s:GotoSourcewinOrCreateIt()
! if !win_gotoid(s:sourcewin)
new
! let s:sourcewin = win_getid(winnr())
call s:InstallWinbar()
endif
endfunc
***************
*** 506,512 ****
let s:stopped = 0
endif
! call s:GotoStartwinOrCreateIt()
let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
--- 785,791 ----
let s:stopped = 0
endif
! call s:GotoSourcewinOrCreateIt()
let fname = substitute(a:msg, '.*fullname="\([^"]*\)".*', '\1', '')
if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
***************
*** 516,522 ****
if &modified
" TODO: find existing window
exe 'split ' . fnameescape(fname)
! let s:startwin = win_getid(winnr())
call s:InstallWinbar()
else
exe 'edit ' . fnameescape(fname)
--- 795,801 ----
if &modified
" TODO: find existing window
exe 'split ' . fnameescape(fname)
! let s:sourcewin = win_getid(winnr())
call s:InstallWinbar()
else
exe 'edit ' . fnameescape(fname)
*** ../vim-8.1.0070/src/version.c 2018-06-17 20:10:36.208066158 +0200
--- src/version.c 2018-06-17 21:30:33.843055781 +0200
***************
*** 763,764 ****
--- 763,766 ----
{ /* Add new patch number below this line */
+ /**/
+ 71,
/**/
--
hundred-and-one symptoms of being an internet addict:
66. You create a homepage with the impression to cure the afflicted...but
your hidden agenda is to receive more e-mail.
/// 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.