X-Git-Url: https://git.sthu.org/?a=blobdiff_plain;f=pygdb.vim;h=d7b68e7b94563ced5612f7235fb88179fe412aac;hb=afd9117c8d1d5f614acc120f28c668655be20abf;hp=d61c4f1fddff74700fd039f62cc501073c70c342;hpb=cbf061bb713edf755eac6910c0526864754f47a3;p=pygdb.git diff --git a/pygdb.vim b/pygdb.vim index d61c4f1..d7b68e7 100644 --- a/pygdb.vim +++ b/pygdb.vim @@ -13,14 +13,10 @@ import os import string import sys import threading - import vim -#Do not use a ~ for home directory -pygdbdir = "/home/shuber/projekte/pygdb" -sys.path.append(pygdbdir) - import Configuration +import DbgTerminal @@ -29,14 +25,13 @@ import Configuration gdbBps = [] signnum = 0 clientcmd = "" +execsign = None def gdbLaunch(): global gdbterm, mainctrlwnd, statuswnd, gdbBps, clientcmd, gdbthread - clientcmd = vim.eval("input('Client commando: ', '%s')" % clientcmd).strip() - if clientcmd.strip()=="": print "No command given!" return @@ -44,6 +39,7 @@ def gdbLaunch(): #Add the breakpoints to the configuration conf = Configuration.Configuration() conf.load(".pygdb.conf") + conf.breakpoints = [] for bp in gdbBps: conf.addBreak(bp["file"], bp["lineno"], bp["cond"]) conf.store(".pygdb.conf") @@ -63,20 +59,79 @@ def gdbToggleBreakpoint(lineno=None, file=None): #Determine index of breakpoint bpidx = gdbGetBreakpoint( file, lineno ) - #Remove the breakpoint if bpidx != None: - vim.command("sign unplace %(signnum)d" % gdbBps[bpidx]) - del gdbBps[bpidx] - - #Create the breakpoint + removeBreakpoint(bpidx) else: - #Determine a sign number - signnum = gdbNewSignnum() + addBreakpoint(file, lineno) + + +def setExecutionLine(file, lineno): + global execsign + + + #Open that file! + if file != getCurrentFile(): + try: + os.stat(file) + vim.command(":e %s" % file) + except OSError: + print "Warning: file '%s' does not exist! (Wrong client command?)" % file + return + + #Jump to line + vim.command(":%d" % lineno) + + #Remove old execsign + if execsign != None: + delExecutionLine() + + #Set the sign + execsign = gdbNewSignnum() + vim.command("sign place %d line=%s name=ExecutionLine file=%s"%(execsign, lineno, file)) + + +def delExecutionLine(): + global execsign + + #Remove old execsign + if execsign != None: + vim.command("sign unplace %d" % execsign) + execsign = None - #Create breakpoint and add sign - b = {"signnum" : signnum, "lineno" : lineno, "file" : file, "cond" : None} + +def addBreakpoint(file, lineno, cond=None): + global gdbBps, cmdset + + #If file is not open, open it + if not file in [b.name for b in vim.buffers]: + try: + os.stat(file) + vim.command(":e %s" % file) + except OSError: + print "Warning: file '%s' does not exist! (Wrong client command?)" % file + cmdset = False + return + + + #Determine a sign number + signnum = gdbNewSignnum() + + #Create breakpoint and add sign + b = {"signnum" : signnum, "lineno" : lineno, "file" : file, "cond" : cond} + gdbBps += [b] + + if cond == None: vim.command("sign place %(signnum)d line=%(lineno)d name=BreakPoint file=%(file)s" % b) - gdbBps += [b] + else: + vim.command("sign place %(signnum)d line=%(lineno)d name=CondBreakPoint file=%(file)s" % b) + + + +def removeBreakpoint(idx): + global gdbBps + + vim.command("sign unplace %(signnum)d" % gdbBps[idx]) + del gdbBps[idx] def gdbBreakpointCond(lineno=None, file=None, cond=None): @@ -91,24 +146,15 @@ def gdbBreakpointCond(lineno=None, file=None, cond=None): #Determine index of breakpoint bpidx = gdbGetBreakpoint( file, lineno ) - #Remove the breakpoint + #Alter condition if bpidx != None: - if cond == None: - cond = vim.eval("input('Breakpoint condition: ', '%s')" % gdbBps[bpidx]["cond"]) - gdbBps[bpidx]["cond"] = cond - + gdbBps[bpidx]["cond"] = vim.eval("input('Breakpoint condition: ', '%s')" % gdbBps[bpidx]["cond"]) + #Set new breakpoint else: - #Determine a sign number - signnum = gdbNewSignnum() - #Get condition - if cond == None: - cond = vim.eval("input('Breakpoint condition: ', '')") - - #Create breakpoint and add sign - b = {"signnum" : signnum, "lineno" : lineno, "file" : file, "cond" : cond} - vim.command("sign place %(signnum)d line=%(lineno)d name=CondBreakPoint file=%(file)s" % b) - gdbBps += [b] + cond = vim.eval("input('Breakpoint condition: ', '')") + #Add the breakpoint + addBreakpoint(file, lineno, cond) def getCurrentFile(): @@ -128,29 +174,92 @@ def gdbGetBreakpoint(file, lineno): return i return None +def gdbShowBreakpoints(): + global gdbBps + + if len(gdbBps) == 0: + print "No breakpoints set." + else: + print "%d breakpoints set:" % len(gdbBps) ->> + for bp in gdbBps: + if bp["cond"] != None: + print "%(file)s:%(lineno)d if %(cond)s" % bp + else: + print "%(file)s:%(lineno)d" % bp + + + +def toAbsPath(path): + global clientcmd, cmdset + + #Not a absolute path --> make one + if path[0] != os.sep: + + #We need the client command to expand the paths... + while clientcmd == "" or not cmdset: + clientcmd = vim.eval("input('Client commando: ', '%s')" % clientcmd).strip() + cmdset = True + + #Get the dirs where executeable is in + relcmd = string.split(clientcmd)[0] + abscmd = DbgTerminal.relToAbsPath(getCurrentFile(), relcmd) + path = DbgTerminal.relToAbsPath(abscmd, path) + + assert(path[0] == "/") + return path -highlight ExecutionLine term=bold ctermbg=DarkGreen ctermfg=White -highlight BreakPoint term=inverse ctermbg=DarkCyan ctermfg=Black + +def gdbLoadConfig(): + global clientcmd, gdbBps, cmdset + + + + + #Load configuration + conf = Configuration.Configuration() + conf.load(".pygdb.conf") + + #Remove all breakpoints + while len(gdbBps)>0: + removeBreakpoint(0) + + #Add breakpoints from configuration + for bp in conf.breakpoints: + bp["file"] = toAbsPath( bp["file"] ) + addBreakpoint(bp["file"], bp["lineno"], bp["cond"]) + + #Set current execution line + if conf.isCurrposSet(): + file = toAbsPath(conf.currfile) + setExecutionLine(file, conf.currlineno) + else: + delExecutionLine() +>> + +highlight ExecutionLine term=bold ctermbg=DarkGreen ctermfg=Black guibg=LightGreen guifg=Black +highlight BreakPoint term=inverse ctermbg=DarkRed ctermfg=Black guibg=LightRed guifg=Black sign define ExecutionLine text==> texthl=ExecutionLine linehl=ExecutionLine sign define BreakPoint text=! texthl=BreakPoint linehl=BreakPoint sign define CondBreakPoint text=? texthl=BreakPoint linehl=BreakPoint - command! GDBLaunch :python gdbLaunch() command! GDBToggleBreakpoint :python gdbToggleBreakpoint() command! GDBBreakpointCond :python gdbBreakpointCond() +command! GDBShowBreakpoints :python gdbShowBreakpoints() +command! GDBLoadConfig :python gdbLoadConfig() function! GDBMapDefaults() nmap :GDBLaunch nmap :GDBToggleBreakpoint - nmap :GDBBreakpointCond + nmap :GDBBreakpointCond + nmap :GDBShowBreakpoints + nmap :GDBLoadConfig endfunction