20
20
from bpython .curtsiesfrontend import events as bpythonevents
21
21
from bpython import inspection
22
22
from bpython .repl import extract_exit_value
23
- from bpython .curtsiesfrontend .repl import debugger_hook
24
23
25
- logger = logging .getLogger (__name__ )
24
+ try :
25
+ from bpython import debugger
26
+ except ImportError as err :
27
+ debugger = None
26
28
29
+ logger = logging .getLogger (__name__ )
27
30
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
30
35
31
36
32
37
def main (args = None , locals_ = None , banner = None ):
@@ -51,8 +56,6 @@ def main(args=None, locals_=None, banner=None):
51
56
logging .getLogger ('curtsies' ).propagate = False
52
57
logging .getLogger ('bpython' ).addHandler (handler )
53
58
logging .getLogger ('bpython' ).propagate = False
54
- if options .debugger :
55
- sys .excepthook = debugger_hook
56
59
57
60
interp = None
58
61
paste = None
@@ -81,23 +84,31 @@ def main(args=None, locals_=None, banner=None):
81
84
print (bpargs .version_banner ())
82
85
try :
83
86
exit_value = mainloop (config , locals_ , banner , interp , paste ,
84
- interactive = (not exec_args ))
87
+ interactive = (not exec_args ),
88
+ debugger = options .debugger )
85
89
except (SystemExitFromCodeGreenlet , SystemExit ) as e :
86
90
exit_value = e .args
87
91
return extract_exit_value (exit_value )
88
92
89
93
90
94
def 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 :
101
112
request_refresh = input_generator .event_trigger (
102
113
bpythonevents .RefreshRequestEvent )
103
114
schedule_refresh = input_generator .scheduled_event_trigger (
@@ -118,8 +129,6 @@ def after_suspend():
118
129
window .__enter__ ()
119
130
interrupting_refresh ()
120
131
121
- # global for easy introspection `from bpython.curtsies import repl`
122
- global repl
123
132
with Repl (config = config ,
124
133
locals_ = locals_ ,
125
134
request_refresh = request_refresh ,
@@ -134,6 +143,7 @@ def after_suspend():
134
143
orig_tcattrs = input_generator .original_stty ,
135
144
on_suspend = on_suspend ,
136
145
after_suspend = after_suspend ) as repl :
146
+ repls .append (repl )
137
147
repl .height , repl .width = window .t .height , window .t .width
138
148
139
149
def process_event (e ):
0 commit comments