2 Backend to the console plugin.
4 @author: Eitan Isaacson
5 @organization: IBM Corporation
6 @copyright: Copyright (c) 2007 IBM Corporation
9 All rights reserved. This program and the accompanying materials are made
10 available under the terms of the BSD which accompanies this distribution, and
11 is available at U{http://www.opensource.org/licenses/bsd-license.php}
21 from StringIO
import StringIO
24 ansi_colors = {
'0;30':
'Black',
37 '1;35':
'MediumPurple',
42 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
43 cin=
None, cout=
None,cerr=
None, input_func=
None):
45 IPython.iplib.raw_input_original = input_func
47 IPython.Shell.Term.cin = cin
49 IPython.Shell.Term.cout = cout
51 IPython.Shell.Term.cerr = cerr
58 IPython.iplib.raw_input =
lambda x:
None
60 self.
term = IPython.genutils.IOTerm(cin=cin, cout=cout, cerr=cerr)
61 os.environ[
'TERM'] =
'dumb'
62 excepthook = sys.excepthook
63 self.
IP = IPython.Shell.make_IPython(argv,user_ns=user_ns,
64 user_global_ns=user_global_ns,
66 shell_class=IPython.Shell.InteractiveShell)
67 self.IP.system =
lambda cmd: self.
shell(self.IP.var_expand(cmd),
68 header=
'IPython system call: ',
69 verbose=self.IP.rc.system_verbose)
70 sys.excepthook = excepthook
77 orig_stdout = sys.stdout
78 sys.stdout = IPython.Shell.Term.cout
80 line = self.IP.raw_input(
None, self.
iter_more)
81 if self.IP.autoindent:
82 self.IP.readline_startup_hook(
None)
83 except KeyboardInterrupt:
84 self.IP.write(
'\nKeyboardInterrupt\n')
87 self.IP.outputcache.prompt_count -= 1
89 if self.IP.autoindent:
90 self.IP.indent_current_nsp = 0
93 self.IP.showtraceback()
96 if (self.IP.SyntaxTB.last_syntax_error
and
97 self.IP.rc.autoedit_syntax):
98 self.IP.edit_syntax_error()
100 self.
prompt = str(self.IP.outputcache.prompt2).strip()
101 if self.IP.autoindent:
102 self.IP.readline_startup_hook(self.IP.pre_readline)
104 self.
prompt = str(self.IP.outputcache.prompt1).strip()
105 sys.stdout = orig_stdout
124 self.IP.user_ns.update(ns_dict)
127 split_line = self.complete_sep.split(line)
128 possibilities = self.IP.complete(split_line[-1])
131 completed = line[:-len(split_line[-1])]+common_prefix
134 return completed, possibilities
137 for i
in range(len(str1)):
138 if not str2.startswith(str1[:i+1]):
142 def shell(self, cmd,verbose=0,debug=0,header=''):
144 if verbose
or debug:
print header+cmd
147 input, output = os.popen4(cmd)
154 gtk.TextView.__init__(self)
155 self.modify_font(pango.FontDescription(
'Mono'))
156 self.set_cursor_visible(
True)
158 self.
mark = self.text_buffer.create_mark(
'scroll_mark',
159 self.text_buffer.get_end_iter(),
161 for code
in ansi_colors:
162 self.text_buffer.create_tag(code,
163 foreground=ansi_colors[code],
165 self.text_buffer.create_tag(
'0')
166 self.text_buffer.create_tag(
'notouch', editable=
False)
169 self.text_buffer.create_mark(
'line_start',
170 self.text_buffer.get_end_iter(),
True
175 def write(self, text, editable=False):
176 segments = self.color_pat.split(text)
177 segment = segments.pop(0)
178 start_mark = self.text_buffer.create_mark(
None,
179 self.text_buffer.get_end_iter(),
181 self.text_buffer.insert(self.text_buffer.get_end_iter(), segment)
184 ansi_tags = self.color_pat.findall(text)
185 for tag
in ansi_tags:
186 i = segments.index(tag)
187 self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(),
191 self.text_buffer.apply_tag_by_name(
'notouch',
192 self.text_buffer.get_iter_at_mark(start_mark),
193 self.text_buffer.get_end_iter())
194 self.text_buffer.delete_mark(start_mark)
195 self.scroll_mark_onscreen(self.
mark)
199 self.text_buffer.move_mark(self.
line_start,self.text_buffer.get_end_iter())
202 iter = self.text_buffer.get_iter_at_mark(self.
line_start)
203 iter.forward_to_line_end()
204 self.text_buffer.delete(self.text_buffer.get_iter_at_mark(self.
line_start), iter)
205 self.
write(text,
True)
208 rv = self.text_buffer.get_slice(self.text_buffer.get_iter_at_mark(self.
line_start),
209 self.text_buffer.get_end_iter(),
False)
213 iter = self.text_buffer.get_iter_at_mark(self.
line_start)
214 iter.forward_to_line_end()
215 self.text_buffer.apply_tag_by_name(
'notouch',
216 self.text_buffer.get_iter_at_mark(self.
line_start),
218 self.
write(
'\n'+text)
222 self.text_buffer.move_mark(self.
line_start,self.text_buffer.get_end_iter())
223 self.text_buffer.place_cursor(self.text_buffer.get_end_iter())
228 insert_mark = self.text_buffer.get_insert()
229 insert_iter = self.text_buffer.get_iter_at_mark(insert_mark)
230 selection_mark = self.text_buffer.get_selection_bound()
231 selection_iter = self.text_buffer.get_iter_at_mark(selection_mark)
232 start_iter = self.text_buffer.get_iter_at_mark(self.
line_start)
233 if start_iter.compare(insert_iter) <= 0
and \
234 start_iter.compare(selection_iter) <= 0:
236 elif start_iter.compare(insert_iter) > 0
and \
237 start_iter.compare(selection_iter) > 0:
238 self.text_buffer.place_cursor(start_iter)
239 elif insert_iter.compare(selection_iter) < 0:
240 self.text_buffer.move_mark(insert_mark, start_iter)
241 elif insert_iter.compare(selection_iter) > 0:
242 self.text_buffer.move_mark(selection_mark, start_iter)
247 ConsoleView.__init__(self)
249 IterableIPShell.__init__(self, cout=self.
cout,cerr=self.
cout,
251 self.connect(
'key_press_event', self.
keyPress)
253 self.cout.truncate(0)
260 raise KeyboardInterrupt
264 if event.state & gtk.gdk.CONTROL_MASK
and event.keyval == 99:
268 elif event.keyval == gtk.keysyms.Return:
271 elif event.keyval == gtk.keysyms.Up:
274 elif event.keyval == gtk.keysyms.Down:
277 elif event.keyval == gtk.keysyms.Tab:
281 if len(possibilities) > 1:
284 for symbol
in possibilities:
285 self.
write(symbol+
'\n')
293 rv = self.cout.getvalue()
294 if rv: rv = rv.strip(
'\n')
296 self.cout.truncate(0)