|
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