2020from bpython .curtsiesfrontend import events as bpythonevents
2121from bpython import inspection
2222from bpython .repl import extract_exit_value
23- from bpython .curtsiesfrontend .repl import debugger_hook
2423
25- logger = logging .getLogger (__name__ )
24+ try :
25+ from bpython import debugger
26+ except ImportError as err :
27+ debugger = None
2628
29+ logger = logging .getLogger (__name__ )
2730
28- repl = None # global for `from bpython.curtsies import repl`
29- # WARNING Will be a problem if more than one repl is ever instantiated this way
31+ # More than one repl may exist, but input_generator and window are global
32+ repls = []
33+ input_generator = None
34+ window = None
3035
3136
3237def main (args = None , locals_ = None , banner = None ):
@@ -51,8 +56,6 @@ def main(args=None, locals_=None, banner=None):
5156 logging .getLogger ('curtsies' ).propagate = False
5257 logging .getLogger ('bpython' ).addHandler (handler )
5358 logging .getLogger ('bpython' ).propagate = False
54- if options .debugger :
55- sys .excepthook = debugger_hook
5659
5760 interp = None
5861 paste = None
@@ -81,23 +84,31 @@ def main(args=None, locals_=None, banner=None):
8184 print (bpargs .version_banner ())
8285 try :
8386 exit_value = mainloop (config , locals_ , banner , interp , paste ,
84- interactive = (not exec_args ))
87+ interactive = (not exec_args ),
88+ debugger = options .debugger )
8589 except (SystemExitFromCodeGreenlet , SystemExit ) as e :
8690 exit_value = e .args
8791 return extract_exit_value (exit_value )
8892
8993
9094def mainloop (config , locals_ , banner , interp = None , paste = None ,
91- interactive = True ):
92- with curtsies .input .Input (keynames = 'curtsies' , sigint_event = True ) as \
93- input_generator :
94- with curtsies .window .CursorAwareWindow (
95- sys .stdout ,
96- sys .stdin ,
97- keep_last_line = True ,
98- hide_cursor = False ,
99- extra_bytes_callback = input_generator .unget_bytes ) as window :
100-
95+ interactive = True , debugger = False ):
96+ global input_generator
97+ global window
98+
99+ if input_generator is None :
100+ input_generator = curtsies .input .Input (keynames = 'curtsies' ,
101+ sigint_event = True )
102+ if window is None :
103+ window = curtsies .window .CursorAwareWindow (
104+ sys .stdout ,
105+ sys .stdin ,
106+ keep_last_line = True ,
107+ hide_cursor = False ,
108+ extra_bytes_callback = input_generator .unget_bytes )
109+
110+ with input_generator :
111+ with window :
101112 request_refresh = input_generator .event_trigger (
102113 bpythonevents .RefreshRequestEvent )
103114 schedule_refresh = input_generator .scheduled_event_trigger (
@@ -118,8 +129,6 @@ def after_suspend():
118129 window .__enter__ ()
119130 interrupting_refresh ()
120131
121- # global for easy introspection `from bpython.curtsies import repl`
122- global repl
123132 with Repl (config = config ,
124133 locals_ = locals_ ,
125134 request_refresh = request_refresh ,
@@ -134,6 +143,7 @@ def after_suspend():
134143 orig_tcattrs = input_generator .original_stty ,
135144 on_suspend = on_suspend ,
136145 after_suspend = after_suspend ) as repl :
146+ repls .append (repl )
137147 repl .height , repl .width = window .t .height , window .t .width
138148
139149 def process_event (e ):
0 commit comments