Show More
@@ -60,6 +60,7 class PrefilterFrontEnd(LineFrontEndBase): | |||
|
60 | 60 | |
|
61 | 61 | def __init__(self, *args, **kwargs): |
|
62 | 62 | LineFrontEndBase.__init__(self, *args, **kwargs) |
|
63 | self.save_output_hooks() | |
|
63 | 64 | # Instanciate an IPython0 interpreter to be able to use the |
|
64 | 65 | # prefiltering. |
|
65 | 66 | self.ipython0 = make_IPython() |
@@ -78,6 +79,8 class PrefilterFrontEnd(LineFrontEndBase): | |||
|
78 | 79 | # in our environment |
|
79 | 80 | self.ipython0.magic_ls = mk_system_call(self.system_call, |
|
80 | 81 | 'ls -CF') |
|
82 | # And now clean up the mess created by ipython0 | |
|
83 | self.release_output() | |
|
81 | 84 | self.shell.output_trap = RedirectorOutputTrap( |
|
82 | 85 | out_callback=self.write, |
|
83 | 86 | err_callback=self.write, |
@@ -85,10 +88,6 class PrefilterFrontEnd(LineFrontEndBase): | |||
|
85 | 88 | self.shell.traceback_trap = SyncTracebackTrap( |
|
86 | 89 | formatters=self.shell.traceback_trap.formatters, |
|
87 | 90 | ) |
|
88 | # Capture and release the outputs, to make sure all the | |
|
89 | # shadow variables are set | |
|
90 | self.capture_output() | |
|
91 | self.release_output() | |
|
92 | 91 | |
|
93 | 92 | #-------------------------------------------------------------------------- |
|
94 | 93 | # FrontEndBase interface |
@@ -109,18 +108,29 class PrefilterFrontEnd(LineFrontEndBase): | |||
|
109 | 108 | self.release_output() |
|
110 | 109 | |
|
111 | 110 | |
|
111 | def save_output_hooks(self): | |
|
112 | """ Store all the output hooks we can think of, to be able to | |
|
113 | restore them. | |
|
114 | ||
|
115 | We need to do this early, as starting the ipython0 instance will | |
|
116 | screw ouput hooks. | |
|
117 | """ | |
|
118 | self.__old_cout_write = Term.cout.write | |
|
119 | self.__old_cerr_write = Term.cerr.write | |
|
120 | self.__old_stdout = sys.stdout | |
|
121 | self.__old_stderr= sys.stderr | |
|
122 | self.__old_help_output = pydoc.help.output | |
|
123 | self.__old_display_hook = sys.displayhook | |
|
124 | ||
|
125 | ||
|
112 | 126 | def capture_output(self): |
|
113 | 127 | """ Capture all the output mechanisms we can think of. |
|
114 | 128 | """ |
|
115 | self.__old_cout_write = Term.cout.write | |
|
116 | self.__old_err_write = Term.cerr.write | |
|
129 | self.save_output_hooks() | |
|
117 | 130 | Term.cout.write = self.write |
|
118 | 131 | Term.cerr.write = self.write |
|
119 | self.__old_stdout = sys.stdout | |
|
120 | self.__old_stderr= sys.stderr | |
|
121 | 132 | sys.stdout = Term.cout |
|
122 | 133 | sys.stderr = Term.cerr |
|
123 | self.__old_help_output = pydoc.help.output | |
|
124 | 134 | pydoc.help.output = self.shell.output_trap.out |
|
125 | 135 | |
|
126 | 136 | |
@@ -128,10 +138,11 class PrefilterFrontEnd(LineFrontEndBase): | |||
|
128 | 138 | """ Release all the different captures we have made. |
|
129 | 139 | """ |
|
130 | 140 | Term.cout.write = self.__old_cout_write |
|
131 | Term.cerr.write = self.__old_err_write | |
|
141 | Term.cerr.write = self.__old_cerr_write | |
|
132 | 142 | sys.stdout = self.__old_stdout |
|
133 | 143 | sys.stderr = self.__old_stderr |
|
134 | 144 | pydoc.help.output = self.__old_help_output |
|
145 | sys.displayhook = self.__old_display_hook | |
|
135 | 146 | |
|
136 | 147 | |
|
137 | 148 | def complete(self, line): |
@@ -15,6 +15,7 __docformat__ = "restructuredtext en" | |||
|
15 | 15 | from IPython.frontend.prefilterfrontend import PrefilterFrontEnd |
|
16 | 16 | from cStringIO import StringIO |
|
17 | 17 | import string |
|
18 | import sys | |
|
18 | 19 | |
|
19 | 20 | class TestPrefilterFrontEnd(PrefilterFrontEnd): |
|
20 | 21 |
@@ -133,8 +133,6 class ConsoleWidget(editwindow.EditWindow): | |||
|
133 | 133 | # XXX: do not put print statements to sys.stdout/sys.stderr in |
|
134 | 134 | # this method, the print statements will call this method, as |
|
135 | 135 | # you will end up with an infinit loop |
|
136 | if self.debug: | |
|
137 | print >>sys.__stderr__, text | |
|
138 | 136 | title = self.title_pat.split(text) |
|
139 | 137 | if len(title)>1: |
|
140 | 138 | self.title = title[-2] |
@@ -12,7 +12,7 class IPythonXController(WxController): | |||
|
12 | 12 | bindings. |
|
13 | 13 | """ |
|
14 | 14 | |
|
15 |
debug = |
|
|
15 | debug = True | |
|
16 | 16 | |
|
17 | 17 | def __init__(self, *args, **kwargs): |
|
18 | 18 | WxController.__init__(self, *args, **kwargs) |
@@ -42,12 +42,13 from IPython.frontend.prefilterfrontend import PrefilterFrontEnd | |||
|
42 | 42 | # Constants |
|
43 | 43 | #------------------------------------------------------------------------------- |
|
44 | 44 | |
|
45 |
|
|
|
46 |
_ |
|
|
45 | _COMPLETE_BUFFER_BG = '#FAFAF1' # Nice green | |
|
46 | _INPUT_BUFFER_BG = '#FDFFD3' # Nice yellow | |
|
47 | 47 | _ERROR_BG = '#FFF1F1' # Nice red |
|
48 | 48 | |
|
49 |
_ |
|
|
49 | _COMPLETE_BUFFER_MARKER = 31 | |
|
50 | 50 | _ERROR_MARKER = 30 |
|
51 | _INPUT_MARKER = 29 | |
|
51 | 52 | |
|
52 | 53 | prompt_in1 = \ |
|
53 | 54 | '\n\x01\x1b[0;34m\x02In [\x01\x1b[1;34m\x02$number\x01\x1b[0;34m\x02]: \x01\x1b[0m\x02' |
@@ -124,6 +125,8 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
124 | 125 | # while it is being swapped |
|
125 | 126 | _out_buffer_lock = Lock() |
|
126 | 127 | |
|
128 | _markers = dict() | |
|
129 | ||
|
127 | 130 | #-------------------------------------------------------------------------- |
|
128 | 131 | # Public API |
|
129 | 132 | #-------------------------------------------------------------------------- |
@@ -136,9 +139,12 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
136 | 139 | ConsoleWidget.__init__(self, parent, id, pos, size, style) |
|
137 | 140 | PrefilterFrontEnd.__init__(self) |
|
138 | 141 | |
|
139 |
# Marker for |
|
|
140 |
self.MarkerDefine(_ |
|
|
141 |
background=_ |
|
|
142 | # Marker for complete buffer. | |
|
143 | self.MarkerDefine(_COMPLETE_BUFFER_MARKER, stc.STC_MARK_BACKGROUND, | |
|
144 | background=_COMPLETE_BUFFER_BG) | |
|
145 | # Marker for current input buffer. | |
|
146 | self.MarkerDefine(_INPUT_MARKER, stc.STC_MARK_BACKGROUND, | |
|
147 | background=_INPUT_BUFFER_BG) | |
|
142 | 148 | # Marker for tracebacks. |
|
143 | 149 | self.MarkerDefine(_ERROR_MARKER, stc.STC_MARK_BACKGROUND, |
|
144 | 150 | background=_ERROR_BG) |
@@ -148,6 +154,10 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
148 | 154 | self._buffer_flush_timer = wx.Timer(self, BUFFER_FLUSH_TIMER_ID) |
|
149 | 155 | wx.EVT_TIMER(self, BUFFER_FLUSH_TIMER_ID, self._buffer_flush) |
|
150 | 156 | |
|
157 | # Inject self in namespace, for debug | |
|
158 | if self.debug: | |
|
159 | self.shell.user_ns['self'] = self | |
|
160 | ||
|
151 | 161 | |
|
152 | 162 | def raw_input(self, prompt): |
|
153 | 163 | """ A replacement from python's raw_input. |
@@ -258,7 +268,9 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
258 | 268 | end_line = self.current_prompt_line \ |
|
259 | 269 | + max(1, len(raw_string.split('\n'))-1) |
|
260 | 270 | for i in range(self.current_prompt_line, end_line): |
|
261 | self.MarkerAdd(i, _RUNNING_BUFFER_MARKER) | |
|
271 | if i in self._markers: | |
|
272 | self.MarkerDeleteHandle(self._markers[i]) | |
|
273 | self._markers[i] = self.MarkerAdd(i, _COMPLETE_BUFFER_MARKER) | |
|
262 | 274 | # Update the display: |
|
263 | 275 | wx.Yield() |
|
264 | 276 | self.GotoPos(self.GetLength()) |
@@ -273,7 +285,7 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
273 | 285 | |
|
274 | 286 | def release_output(self): |
|
275 | 287 | __builtin__.raw_input = self.__old_raw_input |
|
276 |
PrefilterFrontEnd. |
|
|
288 | PrefilterFrontEnd.release_output(self) | |
|
277 | 289 | |
|
278 | 290 | |
|
279 | 291 | def after_execute(self): |
@@ -288,7 +300,7 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
288 | 300 | PrefilterFrontEnd.show_traceback(self) |
|
289 | 301 | wx.Yield() |
|
290 | 302 | for i in range(start_line, self.GetCurrentLine()): |
|
291 | self.MarkerAdd(i, _ERROR_MARKER) | |
|
303 | self._markers[i] = self.MarkerAdd(i, _ERROR_MARKER) | |
|
292 | 304 | |
|
293 | 305 | |
|
294 | 306 | #-------------------------------------------------------------------------- |
@@ -403,6 +415,8 class WxController(ConsoleWidget, PrefilterFrontEnd): | |||
|
403 | 415 | """ |
|
404 | 416 | if self.debug: |
|
405 | 417 | print >>sys.__stdout__, repr(self.input_buffer) |
|
418 | i = self.GetLineCount() | |
|
419 | self._markers[i] = self.MarkerAdd(i, _INPUT_MARKER) | |
|
406 | 420 | PrefilterFrontEnd._on_enter(self) |
|
407 | 421 | |
|
408 | 422 |
@@ -68,10 +68,12 class OutputTrap(object): | |||
|
68 | 68 | """ Remove the hooks. |
|
69 | 69 | """ |
|
70 | 70 | |
|
71 |
|
|
|
71 | if self.out_set: | |
|
72 | sys.stdout = self._out_save | |
|
72 | 73 | self.out_set = False |
|
73 | 74 | |
|
74 |
|
|
|
75 | if self.err_set: | |
|
76 | sys.stderr = self._err_save | |
|
75 | 77 | self.err_set = False |
|
76 | 78 | |
|
77 | 79 | def clear(self): |
General Comments 0
You need to be logged in to leave comments.
Login now