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