|
38 | 38 | from bpython._py3compat import py3 |
39 | 39 | from bpython.pager import get_pager_command |
40 | 40 |
|
| 41 | +try: |
| 42 | + from bpython import debugger |
| 43 | +except ImportError as err: |
| 44 | + debugger = None |
| 45 | + |
41 | 46 | from bpython.curtsiesfrontend import replpainter as paint |
42 | 47 | from bpython.curtsiesfrontend import sitefix |
43 | 48 | from bpython.curtsiesfrontend.coderunner import CodeRunner, FakeOutput |
@@ -631,6 +636,8 @@ def process_key_event(self, e): |
631 | 636 | self.clear_modules_and_reevaluate() |
632 | 637 | elif e in key_dispatch[self.config.toggle_file_watch_key]: |
633 | 638 | return self.toggle_file_watch() |
| 639 | + elif e in key_dispatch[self.config.debug_key]: |
| 640 | + self.toggle_auto_debug() |
634 | 641 | elif e in key_dispatch[self.config.clear_screen_key]: |
635 | 642 | self.request_paint_to_clear_screen = True |
636 | 643 | elif e in key_dispatch[self.config.show_source_key]: |
@@ -871,6 +878,16 @@ def toggle_file_watch(self): |
871 | 878 | self.status_bar.message(_('Auto-reloading not available because ' |
872 | 879 | 'watchdog not installed.')) |
873 | 880 |
|
| 881 | + def toggle_auto_debug(self): |
| 882 | + if debugger is None: |
| 883 | + self.status_bar.message( |
| 884 | + _('No debugger, check your PYTHON_DEBUGGER value.\n')) |
| 885 | + return |
| 886 | + if sys.excepthook is not debugger_hook: |
| 887 | + sys.excepthook = debugger_hook |
| 888 | + else: |
| 889 | + sys.excepthook = sys.__excepthook__ |
| 890 | + |
874 | 891 | # Handler Helpers |
875 | 892 | def add_normal_character(self, char): |
876 | 893 | if len(char) > 1 or is_nop(char): |
@@ -1602,6 +1619,13 @@ def compress_paste_event(paste_event): |
1602 | 1619 | return None |
1603 | 1620 |
|
1604 | 1621 |
|
| 1622 | +def debugger_hook(exc, value, tb): |
| 1623 | + if exc in (SyntaxError, IndentationError, KeyboardInterrupt): |
| 1624 | + sys.__excepthook__(exc, value, tb) |
| 1625 | + return |
| 1626 | + debugger.post_mortem(tb, exc, value) |
| 1627 | + |
| 1628 | + |
1605 | 1629 | def just_simple_events(event_list): |
1606 | 1630 | simple_events = [] |
1607 | 1631 | for e in event_list: |
|
0 commit comments