diff options
author | Gareth Parker <gareth@brainnwave.com> | 2019-07-03 12:54:30 +0100 |
---|---|---|
committer | Gareth Parker <gareth@brainnwave.com> | 2019-07-03 12:54:30 +0100 |
commit | 18a65deade49535d3b3001f4378b0e8f355f50a5 (patch) | |
tree | 0cab2c9a11f54a5a978c9cf4c9e8135f6206228b | |
parent | 205f848d819b063ef229273f28c0b4a570c5934e (diff) | |
download | vdebug-18a65deade49535d3b3001f4378b0e8f355f50a5.zip |
Adding support for breakpoint enabling/disabling
-rw-r--r-- | plugin/vdebug.vim | 14 | ||||
-rw-r--r-- | python3/vdebug/breakpoint.py | 43 | ||||
-rw-r--r-- | python3/vdebug/dbgp.py | 6 | ||||
-rw-r--r-- | python3/vdebug/debugger_interface.py | 15 | ||||
-rw-r--r-- | python3/vdebug/event.py | 36 | ||||
-rw-r--r-- | python3/vdebug/ui/vimui.py | 11 | ||||
-rw-r--r-- | python3/vdebug/util.py | 3 |
7 files changed, 125 insertions, 3 deletions
diff --git a/plugin/vdebug.vim b/plugin/vdebug.vim index 9eb9ead..95e00fe 100644 --- a/plugin/vdebug.vim +++ b/plugin/vdebug.vim @@ -90,6 +90,7 @@ let g:vdebug_options_defaults = { \ 'marker_open_tree' : '▾', \ 'sign_breakpoint' : '▷', \ 'sign_current' : '▶', +\ 'sign_disabled': '▌▌', \ 'continuous_mode' : 1, \ 'background_listener' : 1, \ 'auto_start' : 1, @@ -142,6 +143,7 @@ end function! s:DefineSigns() exe 'sign define breakpt text=' . g:vdebug_options['sign_breakpoint'] . ' texthl=DbgBreakptSign linehl=DbgBreakptLine' exe 'sign define current text=' . g:vdebug_options['sign_current'] . ' texthl=DbgCurrentSign linehl=DbgCurrentLine' + exe 'sign define breakpt_dis text=' . g:vdebug_options['sign_disabled'] . ' texthl=DbgDisabledSign linehl=DbgDisabledLine' endfunction function! s:BreakpointTypes(A,L,P) @@ -221,6 +223,15 @@ function! Vdebug_load_keymaps(keymaps) if has_key(g:vdebug_keymap, 'set_breakpoint') exe 'silent! nunmap '.g:vdebug_keymap['set_breakpoint'] endif + if has_key(g:vdebug_keymap, 'toggle_breakpoint') + exe 'silent! nunmap '.g:vdebug_keymap['toggle_breakpoint'] + endif + if has_key(g:vdebug_keymap, 'enable_breakpoint') + exe 'silent! nunmap '.g:vdebug_keymap['enable_breakpoint'] + endif + if has_key(g:vdebug_keymap, 'disable_breakpoint') + exe 'silent! nunmap '.g:vdebug_keymap['disable_breakpoint'] + endif if has_key(g:vdebug_keymap, 'eval_visual') exe 'silent! vunmap '.g:vdebug_keymap['eval_visual'] endif @@ -232,6 +243,9 @@ function! Vdebug_load_keymaps(keymaps) exe 'noremap '.g:vdebug_keymap['run'].' :python3 debugger.run()<cr>' exe 'noremap '.g:vdebug_keymap['close'].' :python3 debugger.close()<cr>' exe 'noremap '.g:vdebug_keymap['set_breakpoint'].' :python3 debugger.set_breakpoint()<cr>' + exe 'noremap '.g:vdebug_keymap['toggle_breakpoint'].' :python3 debugger.toggle_breakpoint()<cr>' + exe 'noremap '.g:vdebug_keymap['enable_breakpoint'].' :python3 debugger.enable_breakpoint()<cr>' + exe 'noremap '.g:vdebug_keymap['disable_breakpoint'].' :python3 debugger.disable_breakpoint()<cr>' " Exceptional case for visual evaluation exe 'vnoremap '.g:vdebug_keymap['eval_visual'].' :python3 debugger.handle_visual_eval()<cr>' diff --git a/python3/vdebug/breakpoint.py b/python3/vdebug/breakpoint.py index ccabcd9..8db45fe 100644 --- a/python3/vdebug/breakpoint.py +++ b/python3/vdebug/breakpoint.py @@ -41,6 +41,33 @@ class Store: res = self.api.breakpoint_set(breakpoint.get_cmd()) breakpoint.set_debugger_id(res.get_id()) + def toggle_breakpoint_by_id(self, id): + id = str(id) + if id not in self.breakpoints: + raise error.BreakpointError("No breakpoint matching ID %s" % id) + if self.breakpoints[id].enabled: + self.disable_breakpoint_by_id(id) + else: + self.enable_breakpoint_by_id(id) + + def enable_breakpoint_by_id(self, id): + id = str(id) + if id not in self.breakpoints: + raise error.BreakpointError("No breakpoint matching ID %s" % id) + dbg_id = self.breakpoints[id].get_debugger_id() + if dbg_id is not None: + self.api.breakpoint_enable(dbg_id) + self.breakpoints[id].on_enable() + + def disable_breakpoint_by_id(self, id): + id = str(id) + if id not in self.breakpoints: + raise error.BreakpointError("No breakpoint matching ID %s" % id) + dbg_id = self.breakpoints[id].get_debugger_id() + if dbg_id is not None: + self.api.breakpoint_disable(dbg_id) + self.breakpoints[id].on_disable() + def remove_breakpoint(self, breakpoint): self.remove_breakpoint_by_id(breakpoint.get_id()) @@ -63,6 +90,9 @@ class Store: self.remove_breakpoint_by_id(id) self.breakpoints = {} + def get_breakpoint_by_id(self, id): + return self.breakpoints[id] + def find_breakpoint(self, file, line): found = None for bp in self.breakpoints.values(): @@ -88,6 +118,7 @@ class Breakpoint: self.id = Breakpoint.id Breakpoint.id += 1 self.ui = ui + self.enabled = True def get_id(self): return self.id @@ -101,6 +132,14 @@ class Breakpoint: def on_add(self): self.ui.register_breakpoint(self) + def on_enable(self): + self.enabled = True + self.ui.enable_breakpoint(self) + + def on_disable(self): + self.enabled = False + self.ui.disable_breakpoint(self) + def on_remove(self): self.ui.remove_breakpoint(self) @@ -188,8 +227,8 @@ class LineBreakpoint(Breakpoint): return self.file def get_cmd(self): - return '-t {} -f "{}" -n {} -s enabled'.format( - self.type, self.file.as_remote(), self.line) + return '-t {} -f "{}" -n {} -s {}'.format( + self.type, self.file.as_remote(), self.line, "enabled" if self.enabled else "disabled") class TemporaryLineBreakpoint(LineBreakpoint): diff --git a/python3/vdebug/dbgp.py b/python3/vdebug/dbgp.py index bfa2ec8..91d5912 100644 --- a/python3/vdebug/dbgp.py +++ b/python3/vdebug/dbgp.py @@ -381,6 +381,12 @@ class Api: def breakpoint_list(self): return self.send_cmd('breakpoint_list') + def breakpoint_disable(self, id): + return self.send_cmd('breakpoint_update', '-d %i -s disabled' % id, Response) + + def breakpoint_enable(self, id): + return self.send_cmd('breakpoint_update', '-d %i -s enabled' % id, Response) + def breakpoint_remove(self, id): """Remove a breakpoint by ID. diff --git a/python3/vdebug/debugger_interface.py b/python3/vdebug/debugger_interface.py index 030d508..484806d 100644 --- a/python3/vdebug/debugger_interface.py +++ b/python3/vdebug/debugger_interface.py @@ -114,6 +114,21 @@ class DebuggerInterface: """ self.session_handler.dispatch_event("set_breakpoint", args) + def toggle_breakpoint(self, args=None): + """Toggle a breakpoint, specified by args + """ + self.session_handler.dispatch_event("toggle_breakpoint", args) + + def enable_breakpoint(self, args=None): + """Enable a breakpoint, specified by args + """ + self.session_handler.dispatch_event("enable_breakpoint", args) + + def disable_breakpoint(self, args=None): + """Disable a breakpoint, specified by args + """ + self.session_handler.dispatch_event("disable_breakpoint", args) + def remove_breakpoint(self, args=None): """Remove one or more breakpoints, specified by args. """ diff --git a/python3/vdebug/event.py b/python3/vdebug/event.py index 49eb893..7c9815c 100644 --- a/python3/vdebug/event.py +++ b/python3/vdebug/event.py @@ -401,6 +401,39 @@ class SetBreakpointEvent(Event): self.session_handler.breakpoints().add_breakpoint(bp) +class ToggleBreakpointEvent(Event): + + def run(self, args): + bp = breakpoint.Breakpoint.parse(self.ui, args) + if bp.type == "line": + id = self.session_handler.breakpoints().find_breakpoint( + bp.get_file(), bp.get_line()) + if id is not None: + self.session_handler.breakpoints().toggle_breakpoint_by_id(id) + + +class EnableBreakpointEvent(Event): + + def run(self, args): + bp = breakpoint.Breakpoint.parse(self.ui, args) + if bp.type == "line": + id = self.session_handler.breakpoints().find_breakpoint( + bp.get_file(), bp.get_line()) + if id is not None: + self.session_handler.breakpoints().enable_breakpoint_by_id(id) + + +class DisableBreakpointEvent(Event): + + def run(self, args): + bp = breakpoint.Breakpoint.parse(self.ui, args) + if bp.type == "line": + id = self.session_handler.breakpoints().find_breakpoint( + bp.get_file(), bp.get_line()) + if id is not None: + self.session_handler.breakpoints().disable_breakpoint_by_id(id) + + class RemoveBreakpointEvent(Event): def run(self, args): @@ -506,6 +539,9 @@ class Dispatcher: "eval": EvalEvent, "set_eval_expression": SetEvalExpressionEvent, "set_breakpoint": SetBreakpointEvent, + "toggle_breakpoint": ToggleBreakpointEvent, + "enable_breakpoint": EnableBreakpointEvent, + "disable_breakpoint": DisableBreakpointEvent, "get_context": GetContextEvent, "reload_keymappings": ReloadKeymappingsEvent, "remove_breakpoint": RemoveBreakpointEvent, diff --git a/python3/vdebug/ui/vimui.py b/python3/vdebug/ui/vimui.py index 3463705..5df6db9 100644 --- a/python3/vdebug/ui/vimui.py +++ b/python3/vdebug/ui/vimui.py @@ -197,6 +197,17 @@ class Ui(interface.Ui): vim.command('sign place %s name=breakpt line=%s file=%s' % (sign_id, line, file.as_local())) + def enable_breakpoint(self, breakpoint): + self.place_breakpoint(breakpoint.id, breakpoint.file, breakpoint.line) + + def disable_breakpoint(self, breakpoint): + self.place_disabled_breakpoint(breakpoint.id, breakpoint.file, breakpoint.line) + + @staticmethod + def place_disabled_breakpoint(sign_id, file, line): + vim.command('sign place %s name=breakpt_dis line=%s file=%s' + % (sign_id, line, file.as_local())) + def remove_breakpoint(self, breakpoint): id = breakpoint.id vim.command('sign unplace %i' % id) diff --git a/python3/vdebug/util.py b/python3/vdebug/util.py index 9ee1e49..653705e 100644 --- a/python3/vdebug/util.py +++ b/python3/vdebug/util.py @@ -104,7 +104,8 @@ class Keymapper: """Map and unmap key commands for the Vim user interface. """ - exclude = ["run", "close", "set_breakpoint", "eval_visual"] + exclude = ["run", "close", "set_breakpoint", "enable_breakpoint", "disable_breakpoint", + "toggle_breakpoint" "eval_visual"] def __init__(self): self.is_mapped = False |