From bd2d911b74fb6c59146eef0e271c539cadd7bd98 Mon Sep 17 00:00:00 2001 From: lijing00333 Date: Fri, 28 Sep 2018 12:33:30 +0800 Subject: [PATCH 1/5] bugfix for "language message" in MacOSX Error detected while processing function 85_readingTimerCallback[1]..378[13]..379[10]..370[16]..vebugger#std#updateMarksForFile[5] ..vebugger#util#listSignsInBuffer[1]..83_listSigns[2]..vebugger#util#EnglishExecute: line 3: E197: Cannot set language to "en_US.utf8" --- autoload/vebugger/util.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vebugger/util.vim b/autoload/vebugger/util.vim index 61bfca6..9835557 100644 --- a/autoload/vebugger/util.vim +++ b/autoload/vebugger/util.vim @@ -137,11 +137,11 @@ endfunction function! vebugger#util#EnglishExecute(command) abort let l:lang = matchstr(execute('language messages'), '"\zs.*\ze"') if l:lang !~ 'en' - language messages en_US.utf8 + exec "language messages " . l:lang endif let l:result = execute(a:command) if l:lang !~ 'en' - language messages l:lang + exec "language messages " . l:lang endif return l:result endfunction From d66eaa85cbc59659510fa2f09a124c4e3d3792ae Mon Sep 17 00:00:00 2001 From: lijing00333 Date: Fri, 28 Sep 2018 20:47:34 +0800 Subject: [PATCH 2/5] add --- autoload/vebugger.vim | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autoload/vebugger.vim b/autoload/vebugger.vim index 3a29b54..48f0d23 100644 --- a/autoload/vebugger.vim +++ b/autoload/vebugger.vim @@ -47,6 +47,8 @@ function! s:f_debugger.invokeReading() dict endfor for l:k in keys(l:newLines) for l:line in l:newLines[l:k] + " remove ANSI Colors + let l:line = substitute(l:line,"\\W\\[\\d\\{-}[a-zA-Z]","","g") call self.handleLine(l:k, l:line) endfor endfor From f79d2f24dfa194f8ef8e66ebeeeb4c9a224917a2 Mon Sep 17 00:00:00 2001 From: lijing00333 Date: Sat, 29 Sep 2018 00:42:15 +0800 Subject: [PATCH 3/5] add all --- autoload/vebugger.vim | 1 + autoload/vebugger/ninspect.vim | 1 + autoload/vebugger/std.vim | 1 + 3 files changed, 3 insertions(+) diff --git a/autoload/vebugger.vim b/autoload/vebugger.vim index 48f0d23..bb0d226 100644 --- a/autoload/vebugger.vim +++ b/autoload/vebugger.vim @@ -323,6 +323,7 @@ endfunction "Perform an action on the actvie debugger, and register that action function! vebugger#userAction(action, ...) + " a:000 => ['std', 'flow', 'continue'] if exists('s:debugger') if has_key(s:debugger, a:action) let s:debugger.lastUserAction = { diff --git a/autoload/vebugger/ninspect.vim b/autoload/vebugger/ninspect.vim index 1a748c2..b22ec40 100644 --- a/autoload/vebugger/ninspect.vim +++ b/autoload/vebugger/ninspect.vim @@ -1,4 +1,5 @@ function! vebugger#ninspect#attach(connection, args) + let l:debugger=vebugger#std#startDebugger(shellescape(vebugger#util#getToolFullPath('node',get(a:args,'version'),'node')) \.' inspect '.a:connection) let l:debugger.state.ninspect={} diff --git a/autoload/vebugger/std.vim b/autoload/vebugger/std.vim index 31aee67..d744b8c 100644 --- a/autoload/vebugger/std.vim +++ b/autoload/vebugger/std.vim @@ -73,6 +73,7 @@ endfunction "Start a debugger with the std settings function! vebugger#std#startDebugger(command) + let l:debugger=vebugger#startDebugger(a:command) call vebugger#std#standardInit(l:debugger) From 4c7ebf5ad72b82bc37d51eff5dae432870210187 Mon Sep 17 00:00:00 2001 From: lijing00333 Date: Sat, 29 Sep 2018 09:15:36 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + autoload/vebugger.vim | 454 +++++++++++++++++++++--------------------- 2 files changed, 231 insertions(+), 227 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..56e6677 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.swp +.netrwhist +./bundle/YouCompleteMe +./bundle/YouCompleteMe/* diff --git a/autoload/vebugger.vim b/autoload/vebugger.vim index bb0d226..9335c45 100644 --- a/autoload/vebugger.vim +++ b/autoload/vebugger.vim @@ -1,201 +1,201 @@ "Read bytes from pipe to buffer function! s:fillBufferFromPipe(pipeObject) - let l:text = a:pipeObject.pipe.read(1024, 0) - let l:totalBytesRead = 0 - while 0 < len(l:text) - let l:totalBytesRead += len(l:text) - let a:pipeObject.buffer .= l:text - let l:text = a:pipeObject.pipe.read(1024, 0) - endwhile - return l:totalBytesRead + let l:text = a:pipeObject.pipe.read(1024, 0) + let l:totalBytesRead = 0 + while 0 < len(l:text) + let l:totalBytesRead += len(l:text) + let a:pipeObject.buffer .= l:text + let l:text = a:pipeObject.pipe.read(1024, 0) + endwhile + return l:totalBytesRead endfunction let s:f_debugger={} "Terminate the debugger function! s:f_debugger.kill() dict - if self.shell.is_valid - call self.addLineToTerminal('','== DEBUGGER TERMINATED ==') - endif - if !has('timers') - let &updatetime=self.prevUpdateTime - endif - call self.shell.kill(15) - if exists('s:debugger') - for l:closeHandler in s:debugger.closeHandlers - call l:closeHandler.handle(self) - endfor - endif + if self.shell.is_valid + call self.addLineToTerminal('','== DEBUGGER TERMINATED ==') + endif + if !has('timers') + let &updatetime=self.prevUpdateTime + endif + call self.shell.kill(15) + if exists('s:debugger') + for l:closeHandler in s:debugger.closeHandlers + call l:closeHandler.handle(self) + endfor + endif endfunction "Write a line to the debugger's interactive shell function! s:f_debugger.writeLine(line) dict - call self.shell.stdin.write(a:line."\n") + call self.shell.stdin.write(a:line."\n") endfunction "Check for new lines from the debugger's interactive shell and handle them function! s:f_debugger.invokeReading() dict - let l:newLines = {} - for l:k in keys(self.pipes) - let l:pipe = self.pipes[l:k] - if 0 < s:fillBufferFromPipe(l:pipe) - let l:nl = l:pipe.bufferer() - if 0 < len(l:nl) - let l:newLines[l:k] = l:nl - endif - endif - endfor - for l:k in keys(l:newLines) - for l:line in l:newLines[l:k] + let l:newLines = {} + for l:k in keys(self.pipes) + let l:pipe = self.pipes[l:k] + if 0 < s:fillBufferFromPipe(l:pipe) + let l:nl = l:pipe.bufferer() + if 0 < len(l:nl) + let l:newLines[l:k] = l:nl + endif + endif + endfor + for l:k in keys(l:newLines) + for l:line in l:newLines[l:k] " remove ANSI Colors let l:line = substitute(l:line,"\\W\\[\\d\\{-}[a-zA-Z]","","g") - call self.handleLine(l:k, l:line) - endfor - endfor - - let l:checkpid=self.shell.checkpid() - if 'exit'==l:checkpid[0] - \|| 'error'==l:checkpid[0] - call self.kill() - endif - if !has('timers') - call feedkeys("f\e", '\n') " Make sure the CursorHold event is refired even if the user does nothing - endif + call self.handleLine(l:k, l:line) + endfor + endfor + + let l:checkpid=self.shell.checkpid() + if 'exit'==l:checkpid[0] + \|| 'error'==l:checkpid[0] + call self.kill() + endif + if !has('timers') + call feedkeys("f\e", '\n') " Make sure the CursorHold event is refired even if the user does nothing + endif endfunction "Handle a single line from the debugger's interactive shell function! s:f_debugger.handleLine(pipeName,line) dict - call self.addLineToTerminal(a:pipeName,a:line) + call self.addLineToTerminal(a:pipeName,a:line) - let l:readResult=deepcopy(self.readResultTemplate,1) + let l:readResult=deepcopy(self.readResultTemplate,1) - for l:readHandler in self.readHandlers - call l:readHandler.handle(a:pipeName,a:line,l:readResult,self) - endfor + for l:readHandler in self.readHandlers + call l:readHandler.handle(a:pipeName,a:line,l:readResult,self) + endfor - for l:thinkHandler in self.thinkHandlers - call l:thinkHandler.handle(l:readResult,self) - endfor + for l:thinkHandler in self.thinkHandlers + call l:thinkHandler.handle(l:readResult,self) + endfor - call self.performWriteActions() + call self.performWriteActions() endfunction "Perform all write actions function! s:f_debugger.performWriteActions() dict - for l:namespace in keys(self.writeActions) - let l:handlers=get(self.writeHandlers,l:namespace) - if !empty(l:handlers) - for l:writeAction in items(self.writeActions[l:namespace]) - if !empty(l:writeAction[1]) - if has_key(l:handlers,l:writeAction[0]) - call l:handlers[l:writeAction[0]].handle(l:writeAction[1],self) - endif - endif - endfor - endif - endfor - call self.generateWriteActionsFromTemplate() + for l:namespace in keys(self.writeActions) + let l:handlers=get(self.writeHandlers,l:namespace) + if !empty(l:handlers) + for l:writeAction in items(self.writeActions[l:namespace]) + if !empty(l:writeAction[1]) + if has_key(l:handlers,l:writeAction[0]) + call l:handlers[l:writeAction[0]].handle(l:writeAction[1],self) + endif + endif + endfor + endif + endfor + call self.generateWriteActionsFromTemplate() endfunction "Show the terminal buffer that gets it's content from the debugger's "interactive shell function! s:f_debugger.showTerminalBuffer() dict - if has_key(self,'terminalBuffer') - if -1 ['std', 'flow', 'continue'] - if exists('s:debugger') - if has_key(s:debugger, a:action) - let s:debugger.lastUserAction = { - \'action': a:action, - \'args': a:000} - - try - doautocmd User Vebugger_PreUserAction - finally - call call(s:debugger[a:action], a:000, s:debugger) - doautocmd User Vebugger_PostUserAction - endtry - else - throw 'Current debugger does not support action '.a:action - endif - endif + if exists('s:debugger') + if has_key(s:debugger, a:action) + let s:debugger.lastUserAction = { + \'action': a:action, + \'args': a:000} + + try + doautocmd User Vebugger_PreUserAction + finally + call call(s:debugger[a:action], a:000, s:debugger) + doautocmd User Vebugger_PostUserAction + endtry + else + throw 'Current debugger does not support action '.a:action + endif + endif endfunction augroup vebugger_hooks - autocmd! - "Make a blank action hook to prevent 'No matching autocommands" warning - autocmd User Vebugger_* echo + autocmd! + "Make a blank action hook to prevent 'No matching autocommands" warning + autocmd User Vebugger_* echo augroup END "Repeat the last action performed on the active debugger function! vebugger#repeatLastUserAction() - if exists('s:debugger') - if has_key(s:debugger, 'lastUserAction') - let l:lastUserAction = s:debugger.lastUserAction - call call(s:debugger[l:lastUserAction.action], l:lastUserAction.args, s:debugger) - endif - endif + if exists('s:debugger') + if has_key(s:debugger, 'lastUserAction') + let l:lastUserAction = s:debugger.lastUserAction + call call(s:debugger[l:lastUserAction.action], l:lastUserAction.args, s:debugger) + endif + endif endfunction "Write a line to the currently active debugger function! vebugger#writeLine(line) - if exists('s:debugger') - call s:debugger.writeLine(a:line) - endif + if exists('s:debugger') + call s:debugger.writeLine(a:line) + endif endfunction "Invoke reading for the currently active debugger function! vebugger#invokeReading() - if exists('s:debugger') - call s:debugger.invokeReading() - endif + if exists('s:debugger') + call s:debugger.invokeReading() + endif endfunction "Fetch the currently active debugger object function! vebugger#getActiveDebugger() - if exists('s:debugger') - return s:debugger - else - return {} - endif + if exists('s:debugger') + return s:debugger + else + return {} + endif endfunction From 5551ec785d701d72c9cb520391357bdf9abfa997 Mon Sep 17 00:00:00 2001 From: lijing00333 Date: Sat, 29 Sep 2018 09:26:47 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E9=9C=80=E6=94=B9Z?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autoload/vebugger/ninspect.vim | 128 ++++---- autoload/vebugger/std.vim | 524 ++++++++++++++++----------------- autoload/vebugger/util.vim | 246 ++++++++-------- 3 files changed, 449 insertions(+), 449 deletions(-) diff --git a/autoload/vebugger/ninspect.vim b/autoload/vebugger/ninspect.vim index b22ec40..4238feb 100644 --- a/autoload/vebugger/ninspect.vim +++ b/autoload/vebugger/ninspect.vim @@ -22,18 +22,18 @@ function! vebugger#ninspect#attach(connection, args) call l:debugger.setWriteHandler('std','evaluateExpressions',function('vebugger#ninspect#_requestEvaluateExpression')) " call l:debugger.setWriteHandler('std','executeStatements',function('vebugger#ninspect#_executeStatements')) " call l:debugger.setWriteHandler('std','removeAfterDisplayed',function('vebugger#ninspect#_removeAfterDisplayed')) - - call l:debugger.setWriteHandler('std','closeDebugger',function('vebugger#ninspect#_closeDebugger')) + + call l:debugger.setWriteHandler('std','closeDebugger',function('vebugger#ninspect#_closeDebugger')) call l:debugger.generateWriteActionsFromTemplate() " call l:debugger.std_addAllBreakpointActions(g:vebugger_breakpoints) - " Don't stop at the beginning - " call l:debugger.writeLine('cont') + " Don't stop at the beginning + " call l:debugger.writeLine('cont') - let s:programOutputMode=0 - let s:programEvalMode=0 + let s:programOutputMode=0 + let s:programEvalMode=0 return l:debugger endfunction @@ -52,7 +52,7 @@ function! vebugger#ninspect#start(entryFile,args) call l:debugger.addReadHandler(function('vebugger#ninspect#_readProgramOutput')) call l:debugger.addReadHandler(function('vebugger#ninspect#_readWhere')) - call l:debugger.addReadHandler(function('vebugger#ninspect#_readEvaluatedExpressions')) + call l:debugger.addReadHandler(function('vebugger#ninspect#_readEvaluatedExpressions')) call l:debugger.addReadHandler(function('vebugger#ninspect#_readFinish')) call l:debugger.setWriteHandler('std','flow',function('vebugger#ninspect#_writeFlow')) @@ -60,73 +60,73 @@ function! vebugger#ninspect#start(entryFile,args) call l:debugger.setWriteHandler('std','evaluateExpressions',function('vebugger#ninspect#_requestEvaluateExpression')) " call l:debugger.setWriteHandler('std','executeStatements',function('vebugger#ninspect#_executeStatements')) " call l:debugger.setWriteHandler('std','removeAfterDisplayed',function('vebugger#ninspect#_removeAfterDisplayed')) - - call l:debugger.setWriteHandler('std','closeDebugger',function('vebugger#ninspect#_closeDebugger')) + + call l:debugger.setWriteHandler('std','closeDebugger',function('vebugger#ninspect#_closeDebugger')) call l:debugger.generateWriteActionsFromTemplate() - " call l:debugger.std_addAllBreakpointActions(g:vebugger_breakpoints) - " Don't stop at the beginning - " call l:debugger.writeLine('cont') - let s:programOutputMode=0 - let s:programEvalMode=0 + " call l:debugger.std_addAllBreakpointActions(g:vebugger_breakpoints) + " Don't stop at the beginning + " call l:debugger.writeLine('cont') + let s:programOutputMode=0 + let s:programEvalMode=0 return l:debugger endfunction function! vebugger#ninspect#_readProgramOutput(pipeName,line,readResult,debugger) - " echom a:line + " echom a:line if 'err'==a:pipeName let a:readResult.std.programOutput={'line':a:line} - else - let l:donematch=matchlist(a:line,'\vdebug\>.............\<\sWaiting\sfor\sthe\sdebugger\sto\sdisconnect...') - if 1.............|^........|^)\<\s(.*)$') - if 3.............\<\sWaiting\sfor\sthe\sdebugger\sto\sdisconnect...') + if 1.............|^........|^)\<\s(.*)$') + if 3.............\<\sWaiting\sfor\sthe\sdebugger\sto\sdisconnect...|Error:\sThis\ssocket\shas\sbeen\sended\sby\sthe\sother\sparty') + let l:matches=matchlist(a:line,'\vdebug\>.............\<\sWaiting\sfor\sthe\sdebugger\sto\sdisconnect...|Error:\sThis\ssocket\shas\sbeen\sended\sby\sthe\sother\sparty') if 13 - let s:programEvalMode=0 + let s:programEvalMode=0 let l:expression=s:programEvalModeExpression let l:value=a:line let a:readResult.std.evaluatedExpression={ diff --git a/autoload/vebugger/std.vim b/autoload/vebugger/std.vim index d744b8c..8b7c495 100644 --- a/autoload/vebugger/std.vim +++ b/autoload/vebugger/std.vim @@ -2,96 +2,96 @@ let g:vebugger_breakpoints=[] "Initialize the default pipe bufferers function! vebugger#std#setStandardBufferers(debugger) - for l:pipe in values(a:debugger.pipes) - let l:pipe.bufferer = function('vebugger#std#readNewLinesFromPipe') - endfor + for l:pipe in values(a:debugger.pipes) + let l:pipe.bufferer = function('vebugger#std#readNewLinesFromPipe') + endfor endfunction "Initialize the std part of the debugger's state function! vebugger#std#setStandardState(debugger) - let a:debugger.state.std={ - \'config':{ - \ 'externalFileStop_flowCommand':''}, - \'location':{}, - \'callstack':[], - \'evaluateExpressions':[]} + let a:debugger.state.std={ + \'config':{ + \ 'externalFileStop_flowCommand':''}, + \'location':{}, + \'callstack':[], + \'evaluateExpressions':[]} endfunction "Initialize the std part of the debugger's read result template function! vebugger#std#setStandardReadResultTemplate(debugger) - let a:debugger.readResultTemplate.std={ - \'programOutput':{}, - \'location':{}, - \'callstack':{}, - \'evaluatedExpression':{}, - \'programFinish':{}, - \'exception':{}} + let a:debugger.readResultTemplate.std={ + \'programOutput':{}, + \'location':{}, + \'callstack':{}, + \'evaluatedExpression':{}, + \'programFinish':{}, + \'exception':{}} endfunction "Initialize the std part of the debugger's write actions template function! vebugger#std#setStandardWriteactionsTemplate(debugger) - let a:debugger.writeActionsTemplate.std={ - \'flow':'', - \'breakpoints':[], - \'evaluateExpressions':[], - \'executeStatements':[], - \'removeAfterDisplayed':[], - \'closeDebugger':''} + let a:debugger.writeActionsTemplate.std={ + \'flow':'', + \'breakpoints':[], + \'evaluateExpressions':[], + \'executeStatements':[], + \'removeAfterDisplayed':[], + \'closeDebugger':''} endfunction "Adds the std_ functions to the debugger object function! vebugger#std#addStandardFunctions(debugger) - for l:k in keys(s:standardFunctions) - let a:debugger['std_'.l:k]=s:standardFunctions[l:k] - endfor + for l:k in keys(s:standardFunctions) + let a:debugger['std_'.l:k]=s:standardFunctions[l:k] + endfor endfunction "Add the standard think handlers to the debugger function! vebugger#std#addStandardThinkHandlers(debugger) - for l:ThinkHandler in values(s:standardThinkHandlers) - call a:debugger.addThinkHandler(l:ThinkHandler) - endfor + for l:ThinkHandler in values(s:standardThinkHandlers) + call a:debugger.addThinkHandler(l:ThinkHandler) + endfor endfunction "Add the standard close handlers to the debugger function! vebugger#std#addStandardCloseHandlers(debugger) - for l:CloseHandler in values(s:standardCloseHandlers) - call a:debugger.addCloseHandler(l:CloseHandler) - endfor + for l:CloseHandler in values(s:standardCloseHandlers) + call a:debugger.addCloseHandler(l:CloseHandler) + endfor endfunction "Performs the standard initialization of the debugger object function! vebugger#std#standardInit(debugger) - call vebugger#std#setStandardBufferers(a:debugger) - call vebugger#std#setStandardState(a:debugger) - call vebugger#std#setStandardReadResultTemplate(a:debugger) - call vebugger#std#setStandardWriteactionsTemplate(a:debugger) - call vebugger#std#addStandardFunctions(a:debugger) - call vebugger#std#addStandardThinkHandlers(a:debugger) - call vebugger#std#addStandardCloseHandlers(a:debugger) + call vebugger#std#setStandardBufferers(a:debugger) + call vebugger#std#setStandardState(a:debugger) + call vebugger#std#setStandardReadResultTemplate(a:debugger) + call vebugger#std#setStandardWriteactionsTemplate(a:debugger) + call vebugger#std#addStandardFunctions(a:debugger) + call vebugger#std#addStandardThinkHandlers(a:debugger) + call vebugger#std#addStandardCloseHandlers(a:debugger) endfunction "Start a debugger with the std settings function! vebugger#std#startDebugger(command) - let l:debugger=vebugger#startDebugger(a:command) + let l:debugger=vebugger#startDebugger(a:command) - call vebugger#std#standardInit(l:debugger) + call vebugger#std#standardInit(l:debugger) - return l:debugger + return l:debugger endfunction "Read and return all new lines from a Vebugger pipe object. function! vebugger#std#readNewLinesFromPipe() dict - let l:lastNewline = strridx(self.buffer, "\n") - if 0 <= l:lastNewline - let l:outLines = split(strpart(self.buffer, 0, l:lastNewline), '\r\n\|\n\|\r') - let self.buffer = strpart(self.buffer, l:lastNewline + 1) - return l:outLines - endif - - return [] + let l:lastNewline = strridx(self.buffer, "\n") + if 0 <= l:lastNewline + let l:outLines = split(strpart(self.buffer, 0, l:lastNewline), '\r\n\|\n\|\r') + let self.buffer = strpart(self.buffer, l:lastNewline + 1) + return l:outLines + endif + + return [] endfunction @@ -100,82 +100,82 @@ endfunction "Shell buffers should not be used when attaching a debugger to a running "process. function! vebugger#std#openShellBuffer(debugger) - if has_key(a:debugger,'shellBuffer') - if -1 if exists('b:debugger') | call b:debugger.kill() | endif - setlocal buftype=nofile - setlocal filetype=VebuggerShell - setlocal bufhidden=wipe - let a:debugger.shellBuffer=bufnr('') - silent file Vebugger:Shell - wincmd p + if has_key(a:debugger,'shellBuffer') + if -1 if exists('b:debugger') | call b:debugger.kill() | endif + setlocal buftype=nofile + setlocal filetype=VebuggerShell + setlocal bufhidden=wipe + let a:debugger.shellBuffer=bufnr('') + silent file Vebugger:Shell + wincmd p endfunction "Closes the shell buffer function! vebugger#std#closeShellBuffer(debugger) - if has_key(a:debugger,'shellBuffer') - if -1" - if mode() == 'n' - " Call echo normaly - call feedkeys(l:echoKeys) - elseif mode() == 'i' - " Execute command in insert mode - call feedkeys("\".l:echoKeys) - endif - " NOTE: Other modes are not supported - else - " Without timer support, feedkeys won't work and we have - " to echo directly - echo join(l:echoLines, "\n") - endif + if empty(get(a:evaluatedExpression,'expression')) + let l:echo = a:evaluatedExpression.value + else + let l:echo = a:evaluatedExpression.expression.': '.a:evaluatedExpression.value + endif + let l:echoLines = split(l:echo, '\r\n\|\n\|\r') + if len(l:echoLines) == 1 + call add(l:echoLines, '') + endif + + if has('timers') + " Convert to an expression we can use with feedkeys. + " string(l:echo) won't do because it uses single-quotes which + " do not escape newlines + let l:echoJoinExpr = 'join('.string(l:echoLines).', "\n")' + + let l:echoKeys = ':echo '.l:echoJoinExpr."\" + if mode() == 'n' + " Call echo normaly + call feedkeys(l:echoKeys) + elseif mode() == 'i' + " Execute command in insert mode + call feedkeys("\".l:echoKeys) + endif + " NOTE: Other modes are not supported + else + " Without timer support, feedkeys won't work and we have + " to echo directly + echo join(l:echoLines, "\n") + endif endfunction "Print an expression that it's evaluation was previously requested function! s:standardThinkHandlers.printEvaluatedExpression(readResult,debugger) dict - let l:evaluatedExpression=a:readResult.std.evaluatedExpression - if !empty(l:evaluatedExpression) - if !empty(get(l:evaluatedExpression,'expression')) - let l:index=index(a:debugger.state.std.evaluateExpressions,l:evaluatedExpression.expression) - if 0<=l:index - call remove(a:debugger.state.std.evaluateExpressions,l:index) - endif - endif - call s:printWithFeedKeys(l:evaluatedExpression) - call a:debugger.addWriteAction('std','removeAfterDisplayed',a:readResult) - endif + let l:evaluatedExpression=a:readResult.std.evaluatedExpression + if !empty(l:evaluatedExpression) + if !empty(get(l:evaluatedExpression,'expression')) + let l:index=index(a:debugger.state.std.evaluateExpressions,l:evaluatedExpression.expression) + if 0<=l:index + call remove(a:debugger.state.std.evaluateExpressions,l:index) + endif + endif + call s:printWithFeedKeys(l:evaluatedExpression) + call a:debugger.addWriteAction('std','removeAfterDisplayed',a:readResult) + endif endfunction "Close the debugger when the program is finished but the debugger wasn't "closed automatically function! s:standardThinkHandlers.closeDebuggerWhenProgramFinishes(readResult,debugger) dict - if !empty(a:readResult.std.programFinish) - call a:debugger.setWriteAction('std','closeDebugger','close') - endif + if !empty(a:readResult.std.programFinish) + call a:debugger.setWriteAction('std','closeDebugger','close') + endif endfunction "Print an exception message function! s:standardThinkHandlers.printException(readResult,debugger) dict - if !empty(a:readResult.std.exception) - echohl WarningMsg - echo a:readResult.std.exception.message."\n" - echohl None - endif + if !empty(a:readResult.std.exception) + echohl WarningMsg + echo a:readResult.std.exception.message."\n" + echohl None + endif endfunction let s:standardCloseHandlers={} "Remove the currently executed line when a debugger is closed function! s:standardCloseHandlers.removeCurrentMarker(debugger) dict - let a:debugger.state.std.location={} - sign unplace 1 + let a:debugger.state.std.location={} + sign unplace 1 endfunction let s:breakpoint_text = get(g:, 'vebugger_breakpoint_text', '->') let s:currentline_text = get(g:, 'vebugger_currentline_text', '**') if hlexists("DebuggedLine") - sign define vebugger_current linehl=DebuggedLine + sign define vebugger_current linehl=DebuggedLine else - execute 'sign define vebugger_current text=' . s:currentline_text + execute 'sign define vebugger_current text=' . s:currentline_text endif if hlexists('BreakPoint') - execute 'sign define vebugger_breakpoint text=' . s:breakpoint_text . ' linehl=BreakPoint texthl=BreakPoint' + execute 'sign define vebugger_breakpoint text=' . s:breakpoint_text . ' linehl=BreakPoint texthl=BreakPoint' else - execute 'sign define vebugger_breakpoint text=' . s:breakpoint_text . ' linehl=ColorColumn texthl=ColorColumn' + execute 'sign define vebugger_breakpoint text=' . s:breakpoint_text . ' linehl=ColorColumn texthl=ColorColumn' endif "Update all the marks(currently executed line and breakpoints) for a file function! vebugger#std#updateMarksForFile(state,filename) - let l:filename=fnamemodify(a:filename,":p") - let l:bufnr = bufnr(l:filename) - if -1 < l:bufnr - exe 'sign unplace 1 file='.fnameescape(fnamemodify(l:filename,':p')) - for l:sign in vebugger#util#listSignsInBuffer(l:bufnr) - if l:sign.name == 'vebugger_breakpoint' - exe 'sign unplace 2 file='.fnameescape(fnamemodify(l:filename,':p')) - endif - endfor - - for l:breakpoint in g:vebugger_breakpoints - if fnamemodify(l:breakpoint.file,':p')==fnamemodify(a:filename,':p') - exe 'sign place 2 name=vebugger_breakpoint line='.l:breakpoint.line.' file='.fnameescape(fnamemodify(l:breakpoint.file,':p')) - endif - endfor - - if !empty(a:state) - if !empty(a:state.std.location) - if fnamemodify(a:state.std.location.file,':p')==fnamemodify(a:filename,':p') - exe 'sign place 1 name=vebugger_current line='.a:state.std.location.line.' file='.fnameescape(fnamemodify(l:filename,':p')) - endif - endif - endif - endif + let l:filename=fnamemodify(a:filename,":p") + let l:bufnr = bufnr(l:filename) + if -1 < l:bufnr + exe 'sign unplace 1 file='.fnameescape(fnamemodify(l:filename,':p')) + for l:sign in vebugger#util#listSignsInBuffer(l:bufnr) + if l:sign.name == 'vebugger_breakpoint' + exe 'sign unplace 2 file='.fnameescape(fnamemodify(l:filename,':p')) + endif + endfor + + for l:breakpoint in g:vebugger_breakpoints + if fnamemodify(l:breakpoint.file,':p')==fnamemodify(a:filename,':p') + exe 'sign place 2 name=vebugger_breakpoint line='.l:breakpoint.line.' file='.fnameescape(fnamemodify(l:breakpoint.file,':p')) + endif + endfor + + if !empty(a:state) + if !empty(a:state.std.location) + if fnamemodify(a:state.std.location.file,':p')==fnamemodify(a:filename,':p') + exe 'sign place 1 name=vebugger_current line='.a:state.std.location.line.' file='.fnameescape(fnamemodify(l:filename,':p')) + endif + endif + endif + endif endfunction "Toggle a breakpoint on and off function! vebugger#std#toggleBreakpoint(file,line) - let l:debugger=vebugger#getActiveDebugger() - let l:debuggerState=empty(l:debugger) - \? {} - \: l:debugger.state - for l:i in range(len(g:vebugger_breakpoints)) - let l:breakpoint=g:vebugger_breakpoints[l:i] - if l:breakpoint.file==a:file && l:breakpoint.line==a:line - call remove(g:vebugger_breakpoints,l:i) - if !empty(l:debugger) - call l:debugger.addWriteActionAndPerform('std','breakpoints',{ - \'action':'remove', - \'file':(a:file), - \'line':(a:line)}) - endif - call vebugger#std#updateMarksForFile(l:debuggerState,a:file) - return - endif - endfor - call add(g:vebugger_breakpoints,{'file':(a:file),'line':(a:line)}) - if !empty(l:debugger) - call l:debugger.addWriteActionAndPerform('std','breakpoints',{ - \'action':'add', - \'file':(a:file), - \'line':(a:line)}) - endif - call vebugger#std#updateMarksForFile(l:debuggerState,a:file) + let l:debugger=vebugger#getActiveDebugger() + let l:debuggerState=empty(l:debugger) + \? {} + \: l:debugger.state + for l:i in range(len(g:vebugger_breakpoints)) + let l:breakpoint=g:vebugger_breakpoints[l:i] + if l:breakpoint.file==a:file && l:breakpoint.line==a:line + call remove(g:vebugger_breakpoints,l:i) + if !empty(l:debugger) + call l:debugger.addWriteActionAndPerform('std','breakpoints',{ + \'action':'remove', + \'file':(a:file), + \'line':(a:line)}) + endif + call vebugger#std#updateMarksForFile(l:debuggerState,a:file) + return + endif + endfor + call add(g:vebugger_breakpoints,{'file':(a:file),'line':(a:line)}) + if !empty(l:debugger) + call l:debugger.addWriteActionAndPerform('std','breakpoints',{ + \'action':'add', + \'file':(a:file), + \'line':(a:line)}) + endif + call vebugger#std#updateMarksForFile(l:debuggerState,a:file) endfunction "Clear all breakpoints function! vebugger#std#clearBreakpoints() - let l:debugger=vebugger#getActiveDebugger() - let l:debuggerState=empty(l:debugger) ? {} : l:debugger.state - let l:files=[] - for l:breakpoint in g:vebugger_breakpoints - if index(l:files,l:breakpoint.file)<0 - call add(l:files,l:breakpoint.file) - endif - if !empty(l:debugger) - call l:debugger.addWriteAction('std','breakpoints',extend({'action':'remove'},l:breakpoint)) - endif - endfor - if !empty(l:debugger) - call l:debugger.performWriteActions() - endif - let g:vebugger_breakpoints=[] - for l:file in l:files - call vebugger#std#updateMarksForFile(l:debuggerState,l:file) - endfor + let l:debugger=vebugger#getActiveDebugger() + let l:debuggerState=empty(l:debugger) ? {} : l:debugger.state + let l:files=[] + for l:breakpoint in g:vebugger_breakpoints + if index(l:files,l:breakpoint.file)<0 + call add(l:files,l:breakpoint.file) + endif + if !empty(l:debugger) + call l:debugger.addWriteAction('std','breakpoints',extend({'action':'remove'},l:breakpoint)) + endif + endfor + if !empty(l:debugger) + call l:debugger.performWriteActions() + endif + let g:vebugger_breakpoints=[] + for l:file in l:files + call vebugger#std#updateMarksForFile(l:debuggerState,l:file) + endfor endfunction diff --git a/autoload/vebugger/util.vim b/autoload/vebugger/util.vim index 9835557..30fa1d2 100644 --- a/autoload/vebugger/util.vim +++ b/autoload/vebugger/util.vim @@ -1,170 +1,170 @@ "Returns the visually selected text function! vebugger#util#get_visual_selection() - "Shamefully stolen from http://stackoverflow.com/a/6271254/794380 - " Why is this not a built-in Vim script function?! - let [lnum1, col1] = getpos("'<")[1:2] - let [lnum2, col2] = getpos("'>")[1:2] - let lines = getline(lnum1, lnum2) - let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] - let lines[0] = lines[0][col1 - 1:] - return join(lines, "\n") + "Shamefully stolen from http://stackoverflow.com/a/6271254/794380 + " Why is this not a built-in Vim script function?! + let [lnum1, col1] = getpos("'<")[1:2] + let [lnum2, col2] = getpos("'>")[1:2] + let lines = getline(lnum1, lnum2) + let lines[-1] = lines[-1][: col2 - (&selection == 'inclusive' ? 1 : 2)] + let lines[0] = lines[0][col1 - 1:] + return join(lines, "\n") endfunction "Prompts the user with a filtered list of process, and returns the process id "the user selects function! vebugger#util#selectProcessOfFile(ofFile) - let l:fileName=fnamemodify(a:ofFile,':t') - if has('win32') - "Get the process data in CSV format - let l:resultLines=split(vimproc#system('tasklist /FO csv /FI "IMAGENAME eq '.l:fileName.'"'),'\r\n\|\n\|\r') - - if l:resultLines[0]=~'\V\^INFO:' - throw 'No matching process found' - endif - "Parse(sort of) the CSV: - let l:resultLinesParsed=map(l:resultLines,'eval("[".v:val."]")') - let l:resultLinesParsed[0][2]='Session' - "Format for output - let l:linesForPrinting=map(copy(l:resultLinesParsed),'v:val[1]."\t".v:val[2]."\t\t".v:val[0]') - else - let l:resultLines=split(vimproc#system('ps -o pid,user,comm,start,state,tt -C '.fnameescape(l:fileName)),'\r\n\|\n\|\r') - let l:linesForPrinting=copy(l:resultLines) - endif - - if len(l:linesForPrinting)<=1 - throw 'No matching process found' - endif - if &lines