summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGareth Parker <gareth@brainnwave.com>2019-07-03 12:54:30 +0100
committerGareth Parker <gareth@brainnwave.com>2019-07-03 12:54:30 +0100
commit18a65deade49535d3b3001f4378b0e8f355f50a5 (patch)
tree0cab2c9a11f54a5a978c9cf4c9e8135f6206228b
parent205f848d819b063ef229273f28c0b4a570c5934e (diff)
downloadvdebug-18a65deade49535d3b3001f4378b0e8f355f50a5.zip
Adding support for breakpoint enabling/disabling
-rw-r--r--plugin/vdebug.vim14
-rw-r--r--python3/vdebug/breakpoint.py43
-rw-r--r--python3/vdebug/dbgp.py6
-rw-r--r--python3/vdebug/debugger_interface.py15
-rw-r--r--python3/vdebug/event.py36
-rw-r--r--python3/vdebug/ui/vimui.py11
-rw-r--r--python3/vdebug/util.py3
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