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}
16 from __future__
import print_function
21 from gi.repository
import Pango
22 from StringIO
import StringIO
25 from pkg_resources
import parse_version
75 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
76 cin=None, cout=None,cerr=None, input_func=None):
79 @param self: this object
80 @param argv: Command line options for IPython
81 @param user_ns: User namespace.
82 @param user_global_ns: User global namespace.
83 @param cin: Console standard input.
84 @param cout: Console standard output.
85 @param cerr: Console standard error.
86 @param input_func: Replacement for builtin raw_input()
90 if parse_version(IPython.release.version) >= parse_version(
"1.2.1"):
91 IPython.terminal.interactiveshell.raw_input_original = input_func
93 IPython.frontend.terminal.interactiveshell.raw_input_original = input_func
95 io.stdin = io.IOStream(cin)
97 io.stdout = io.IOStream(cout)
99 io.stderr = io.IOStream(cerr)
104 io.raw_input =
lambda x:
None
106 os.environ[
'TERM'] =
'dumb'
107 excepthook = sys.excepthook
109 from IPython.config.loader
import Config
111 cfg.InteractiveShell.colors =
"Linux"
116 old_stdout, old_stderr = sys.stdout, sys.stderr
117 sys.stdout, sys.stderr = io.stdout.stream, io.stderr.stream
121 if parse_version(IPython.release.version) >= parse_version(
"1.2.1"):
122 self.
IPIP = IPython.terminal.embed.InteractiveShellEmbed.instance(\
123 config=cfg, user_ns=user_ns)
125 self.
IPIP = IPython.frontend.terminal.embed.InteractiveShellEmbed.instance(\
126 config=cfg, user_ns=user_ns)
128 sys.stdout, sys.stderr = old_stdout, old_stderr
130 self.
IPIP.system =
lambda cmd: self.
shellshell(self.
IPIP.var_expand(cmd),
131 header=
'IPython system call: ')
136 self.
IPIP.raw_input = input_func
137 sys.excepthook = excepthook
143 self.
IPIP.readline_startup_hook(self.
IPIP.pre_readline)
150 Update self.IP namespace for autocompletion with sys.modules
153 for k, v
in list(sys.modules.items()):
155 self.
IPIP.user_ns.update({k:v})
159 Executes the current line provided by the shell object.
163 orig_stdout = sys.stdout
164 sys.stdout = IPython.utils.io.stdout
166 orig_stdin = sys.stdin
167 sys.stdin = IPython.utils.io.stdin;
170 self.
IPIP.hooks.pre_prompt_hook()
175 self.
IPIP.showtraceback()
176 if self.
IPIP.autoindent:
177 self.
IPIP.rl_do_indent =
True
180 line = self.
IPIP.raw_input(self.
promptprompt)
181 except KeyboardInterrupt:
182 self.
IPIP.write(
'\nKeyboardInterrupt\n')
183 self.
IPIP.input_splitter.reset()
185 self.
IPIP.showtraceback()
187 self.
IPIP.input_splitter.push(line)
188 self.
iter_moreiter_more = self.
IPIP.input_splitter.push_accepts_more()
190 if (self.
IPIP.SyntaxTB.last_syntax_error
and
191 self.
IPIP.autoedit_syntax):
192 self.
IPIP.edit_syntax_error()
194 if parse_version(IPython.release.version) >= parse_version(
"2.0.0-dev"):
195 source_raw = self.
IPIP.input_splitter.raw_reset()
197 source_raw = self.
IPIP.input_splitter.source_raw_reset()[1]
198 self.
IPIP.run_cell(source_raw, store_history=
True)
199 self.
IPIP.rl_do_indent =
False
203 self.
IPIP.rl_do_indent =
True
206 sys.stdout = orig_stdout
207 sys.stdin = orig_stdin
211 Generate prompt depending on is_continuation value
213 @param is_continuation
214 @return: The prompt string representation
220 ver = IPython.__version__
222 prompt = self.
IPIP.hooks.generate_prompt(is_continuation)
225 prompt = self.
IPIP.prompt_manager.render(
'in2')
227 prompt = self.
IPIP.prompt_manager.render(
'in')
234 Provides one history command back.
236 @param self this object
237 @return: The command string.
246 Provides one history command forward.
248 @param self this object
249 @return: The command string.
257 Gets the command string of the current history level.
259 @param self this object
260 @return: Historic command string.
263 rv = self.
IPIP.user_ns[
'In'][self.
history_levelhistory_level].strip(
'\n')
270 Add the current dictionary to the shell namespace.
272 @param ns_dict: A dictionary of symbol-values.
275 self.
IPIP.user_ns.update(ns_dict)
279 Returns an auto completed line and/or possibilities for completion.
281 @param line: Given line so far.
282 @return: Line completed as for as possible, and possible further completions.
286 possibilities = self.
IPIP.
complete(split_line[-1])
289 possibilities = [
'', []]
291 def _commonPrefix(str1, str2):
293 Reduction function. returns common prefix of two given strings.
295 @param str1: First string.
296 @param str2: Second string
297 @return: Common prefix to both strings.
299 for i
in range(len(str1)):
300 if not str2.startswith(str1[:i+1]):
304 common_prefix = reduce(_commonPrefix, possibilities[1])
or line[-1]
305 completed = line[:-len(split_line[-1])]+common_prefix
310 return completed, possibilities[1]
313 def shell(self, cmd,verbose=0,debug=0,header=''):
315 Replacement method to allow shell commands without them blocking.
317 @param cmd: Shell command to execute.
318 @param verbose: Verbosity
319 @param debug: Debug level
320 @param header: Header to be printed before output
324 if verbose
or debug: print(header+cmd)
327 input, output = os.popen4(cmd)
345 Specialized text view for console-like workflow.
347 @cvar ANSI_COLORS: Mapping of terminal colors to X11 names.
348 @type ANSI_COLORS: dictionary
350 @ivar text_buffer: Widget's text buffer.
351 @type text_buffer: Gtk.TextBuffer
352 @ivar color_pat: Regex of terminal color pattern
353 @type color_pat: _sre.SRE_Pattern
354 @ivar mark: Scroll mark for automatic scrolling on input.
355 @type mark: Gtk.TextMark
356 @ivar line_start: Start of command line mark.
357 @type line_start: Gtk.TextMark
359 ANSI_COLORS = {
'0;30':
'Black',
'0;31':
'Red',
360 '0;32':
'Green',
'0;33':
'Brown',
361 '0;34':
'Blue',
'0;35':
'Purple',
362 '0;36':
'Cyan',
'0;37':
'LightGray',
363 '1;30':
'DarkGray',
'1;31':
'DarkRed',
364 '1;32':
'SeaGreen',
'1;33':
'Yellow',
365 '1;34':
'LightBlue',
'1;35':
'MediumPurple',
366 '1;36':
'LightCyan',
'1;37':
'White'}
370 Initialize console view.
372 GObject.GObject.__init__(self)
373 self.modify_font(Pango.FontDescription(
'Mono'))
374 self.set_cursor_visible(
True)
384 self.
text_buffertext_buffer.create_tag(
'notouch', editable=
False)
385 self.
color_patcolor_pat = re.compile(
'\x01?\x1b\[(.*?)m\x02?')
387 self.
text_buffertext_buffer.create_mark(
'line_start',
389 self.connect(
'key-press-event', self.
onKeyPressonKeyPress)
391 def write(self, text, editable=False):
393 Write given text to buffer.
395 @param text: Text to append.
396 @param editable: If true, added text is editable.
399 GObject.idle_add(self.
_write_write, text, editable)
403 Write given text to buffer.
405 @param text: Text to append.
406 @param editable: If true, added text is editable.
409 segments = self.
color_patcolor_pat.split(text)
410 segment = segments.pop(0)
411 start_mark = self.
text_buffertext_buffer.create_mark(
None,
417 ansi_tags = self.
color_patcolor_pat.findall(text)
418 for tag
in ansi_tags:
419 i = segments.index(tag)
421 segments[i+1], str(tag))
424 self.
text_buffertext_buffer.apply_tag_by_name(
'notouch',
425 self.
text_buffertext_buffer.get_iter_at_mark(start_mark),
427 self.
text_buffertext_buffer.delete_mark(start_mark)
428 self.scroll_mark_onscreen(self.
markmark)
432 Prints prompt at start of line.
434 @param prompt: Prompt to print.
437 GObject.idle_add(self.
_showPrompt_showPrompt, prompt)
441 Prints prompt at start of line.
443 @param prompt: Prompt to print.
452 Replace currently entered command line with given text.
454 @param text: Text to use as replacement.
457 GObject.idle_add(self.
_changeLine_changeLine, text)
461 Replace currently entered command line with given text.
463 @param text: Text to use as replacement.
467 iter.forward_to_line_end()
469 self.
_write_write(text,
True)
473 Get text in current command line.
475 @return Text of current command line.
484 Show returned text from last command and print new prompt.
486 @param text: Text to show.
493 Show returned text from last command and print new prompt.
495 @param text: Text to show.
499 iter.forward_to_line_end()
504 self.
_write_write(
'\n'+text)
511 if self.IP.rl_do_indent:
512 indentation = self.IP.input_splitter.indent_spaces *
' '
513 self.
text_buffertext_buffer.insert_at_cursor(indentation)
517 Key press callback used for correcting behavior for console-like
518 interfaces. For example 'home' should go to prompt, not to beginning of
521 @param widget: Widget that key press accored in.
522 @param event: Event object
523 @return Return True if event should not trickle.
525 insert_mark = self.
text_buffertext_buffer.get_insert()
526 insert_iter = self.
text_buffertext_buffer.get_iter_at_mark(insert_mark)
527 selection_mark = self.
text_buffertext_buffer.get_selection_bound()
528 selection_iter = self.
text_buffertext_buffer.get_iter_at_mark(selection_mark)
530 if event.keyval == Gdk.KEY_Home:
531 if event.get_state() & Gdk.ModifierType.CONTROL_MASK
or event.get_state() & Gdk.ModifierType.MOD1_MASK:
533 elif event.get_state() & Gdk.ModifierType.SHIFT_MASK:
534 self.
text_buffertext_buffer.move_mark(insert_mark, start_iter)
537 self.
text_buffertext_buffer.place_cursor(start_iter)
539 elif event.keyval == Gdk.KEY_Left:
540 insert_iter.backward_cursor_position()
541 if not insert_iter.editable(
True):
543 elif not event.string:
545 elif start_iter.compare(insert_iter) <= 0
and \
546 start_iter.compare(selection_iter) <= 0:
548 elif start_iter.compare(insert_iter) > 0
and \
549 start_iter.compare(selection_iter) > 0:
550 self.
text_buffertext_buffer.place_cursor(start_iter)
551 elif insert_iter.compare(selection_iter) < 0:
552 self.
text_buffertext_buffer.move_mark(insert_mark, start_iter)
553 elif insert_iter.compare(selection_iter) > 0:
554 self.
text_buffertext_buffer.move_mark(selection_mark, start_iter)
560 For some reason we can't extend onKeyPress directly (bug #500900).
561 @param event key press
567 class IPythonView(ConsoleView, IterableIPShell):
583 Sub-class of both modified IPython shell and L{ConsoleView} this makes
584 a GTK+ IPython console.
588 Initialize. Redirect I/O to console.
590 ConsoleView.__init__(self)
592 IterableIPShell.__init__(self, cout=self.
coutcout,cerr=self.
coutcout,
597 self.
coutcout.truncate(0)
602 Custom raw_input() replacement. Gets current line from console buffer.
604 @param prompt: Prompt to print. Here for compatibility as replacement.
605 @return The current command line text.
609 raise KeyboardInterrupt
614 Key press callback with plenty of shell goodness, like history,
615 autocompletions, etc.
617 @param event: Event object.
618 @return True if event should not trickle.
621 if event.get_state() & Gdk.ModifierType.CONTROL_MASK
and event.keyval == 99:
625 elif event.keyval == Gdk.KEY_Return:
628 elif event.keyval == Gdk.KEY_Up:
631 elif event.keyval == Gdk.KEY_Down:
634 elif event.keyval == Gdk.KEY_Tab:
638 if len(possibilities) > 1:
640 self.
writewrite(
'\n')
641 for symbol
in possibilities:
642 self.
writewrite(symbol+
'\n')
649 Process current command line.
654 rv = self.
coutcout.getvalue()
655 if rv: rv = rv.strip(
'\n')
657 self.
coutcout.truncate(0)
658 self.
coutcout.seek(0)
660 if __name__ ==
"__main__":
661 window = Gtk.Window()
662 window.set_default_size(640, 320)
663 window.connect(
'delete-event',
lambda x, y: Gtk.main_quit())
def write(self, text, editable=False)
Write given text to buffer.
def changeLine(self, text)
Replace currently entered command line with given text.
dictionary ANSI_COLORS
color list
def _showPrompt(self, prompt)
Prints prompt at start of line.
def _showReturned(self, text)
Show returned text from last command and print new prompt.
def getCurrentLine(self)
Get text in current command line.
def onKeyPressExtend(self, event)
For some reason we can't extend onKeyPress directly (bug #500900).
def _write(self, text, editable=False)
Write given text to buffer.
def _changeLine(self, text)
Replace currently entered command line with given text.
def showPrompt(self, prompt)
Prints prompt at start of line.
def showReturned(self, text)
Show returned text from last command and print new prompt.
def onKeyPress(self, widget, event)
Key press callback used for correcting behavior for console-like interfaces.
def onKeyPressExtend(self, event)
Key press callback with plenty of shell goodness, like history, autocompletions, etc.
def raw_input(self, prompt='')
Custom raw_input() replacement.
def _processLine(self)
Process current command line.
def updateNamespace(self, ns_dict)
Add the current dictionary to the shell namespace.
def __init__(self, argv=None, user_ns=None, user_global_ns=None, cin=None, cout=None, cerr=None, input_func=None)
Initializer.
def _getHistory(self)
Gets the command string of the current history level.
def __update_namespace(self)
Update self.IP namespace for autocompletion with sys.modules.
def historyBack(self)
Provides one history command back.
history_level
history level
def generatePrompt(self, is_continuation)
Generate prompt depending on is_continuation value.
def historyForward(self)
Provides one history command forward.
def shell(self, cmd, verbose=0, debug=0, header='')
Replacement method to allow shell commands without them blocking.
def execute(self)
Executes the current line provided by the shell object.
def complete(self, line)
Returns an auto completed line and/or possibilities for completion.