##// END OF EJS Templates
Deprecated the module IPython.utils.warn
Deprecated the module IPython.utils.warn

File last commit:

r21846:5f823782
r22091:c03585df
Show More
interactiveshell.py
807 lines | 30.4 KiB | text/x-python | PythonLexer
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # -*- coding: utf-8 -*-
"""Subclass of InteractiveShell for terminal based frontends."""
Thomas Kluyver
Move most readline code from InteractiveShell to terminal subclass...
r21846 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Matthias BUSSONNIER
use print function in module with `print >>`
r7817 from __future__ import print_function
Brian Granger
Complete reorganization of InteractiveShell....
r2761
import bdb
import os
import sys
MinRK
small changes in response to pyflakes pass...
r6270 from IPython.core.error import TryNext, UsageError
MinRK
move banner to base InteractiveShell class
r16581 from IPython.core.usage import interactive_usage
Thomas Kluyver
Move most readline code from InteractiveShell to terminal subclass...
r21846 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC
Brian Granger
Complete reorganization of InteractiveShell....
r2761 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
Fernando Perez
Renamed @register_magics to @magics_class to avoid confusion....
r6973 from IPython.core.magic import Magics, magics_class, line_magic
Thomas Kluyver
Better clipboard handling, esp. with pywin32...
r13426 from IPython.lib.clipboard import ClipboardEmpty
Thomas Kluyver
Move most readline code from InteractiveShell to terminal subclass...
r21846 from IPython.utils.contexts import NoOpContext
from IPython.utils.decorators import undoc
Brandon Parsons
Feedback from pull request #1245
r6655 from IPython.utils.encoding import get_stream_enc
Thomas Kluyver
Repair various failures in the test suite.
r4734 from IPython.utils import py3compat
Brian Granger
Complete reorganization of InteractiveShell....
r2761 from IPython.utils.terminal import toggle_set_term_title, set_term_title
from IPython.utils.process import abbrev_cwd
Matt Cottingham
Catch clipboard exception in magic_paste and print error message
r5367 from IPython.utils.warn import warn, error
Fernando Perez
Properly clean up input for interactive pasting....
r7717 from IPython.utils.text import num_ini_spaces, SList, strip_email_quotes
Min RK
update dependency imports...
r21253 from traitlets import Integer, CBool, Unicode
Brian Granger
Complete reorganization of InteractiveShell....
r2761
def get_default_editor():
try:
ed = os.environ['EDITOR']
Thomas Kluyver
Fall back to default editor if $EDITOR is non-ASCII....
r13735 if not py3compat.PY3:
ed = ed.decode()
return ed
Brian Granger
Complete reorganization of InteractiveShell....
r2761 except KeyError:
Thomas Kluyver
Fall back to default editor if $EDITOR is non-ASCII....
r13735 pass
except UnicodeError:
warn("$EDITOR environment variable is not pure ASCII. Using platform "
"default editor.")
Brian Granger
Complete reorganization of InteractiveShell....
r2761
Thomas Kluyver
Fall back to default editor if $EDITOR is non-ASCII....
r13735 if os.name == 'posix':
return 'vi' # the only one guaranteed to be there!
else:
return 'notepad' # same in Windows!
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 def get_pasted_lines(sentinel, l_input=py3compat.input, quiet=False):
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435 """ Yield pasted lines until the user enters the given sentinel value.
"""
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 if not quiet:
print("Pasting code; enter '%s' alone on the line to stop or use Ctrl-D." \
% sentinel)
prompt = ":"
else:
prompt = ""
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435 while True:
try:
Thomas Kluyver
Convert cpasted code to unicode on Python 2...
r20327 l = py3compat.str_to_unicode(l_input(prompt))
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435 if l == sentinel:
return
else:
yield l
except EOFError:
Matthias BUSSONNIER
use print function in module with `print >>`
r7817 print('<EOF>')
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435 return
Thomas Kluyver
Move most readline code from InteractiveShell to terminal subclass...
r21846 @undoc
def no_op(*a, **kw): pass
class ReadlineNoRecord(object):
"""Context manager to execute some code, then reload readline history
so that interactive input to the code doesn't appear when pressing up."""
def __init__(self, shell):
self.shell = shell
self._nested_level = 0
def __enter__(self):
if self._nested_level == 0:
try:
self.orig_length = self.current_length()
self.readline_tail = self.get_readline_tail()
except (AttributeError, IndexError): # Can fail with pyreadline
self.orig_length, self.readline_tail = 999999, []
self._nested_level += 1
def __exit__(self, type, value, traceback):
self._nested_level -= 1
if self._nested_level == 0:
# Try clipping the end if it's got longer
try:
e = self.current_length() - self.orig_length
if e > 0:
for _ in range(e):
self.shell.readline.remove_history_item(self.orig_length)
# If it still doesn't match, just reload readline history.
if self.current_length() != self.orig_length \
or self.get_readline_tail() != self.readline_tail:
self.shell.refill_readline_hist()
except (AttributeError, IndexError):
pass
# Returning False will cause exceptions to propagate
return False
def current_length(self):
return self.shell.readline.get_current_history_length()
def get_readline_tail(self, n=10):
"""Get the last n items in readline history."""
end = self.shell.readline.get_current_history_length() + 1
start = max(end-n, 1)
ghi = self.shell.readline.get_history_item
return [ghi(x) for x in range(start, end)]
Fernando Perez
Fix paste/cpaste bug and refactor/cleanup that code a lot....
r5435
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Renamed @register_magics to @magics_class to avoid confusion....
r6973 @magics_class
Fernando Perez
Update terminal-only magics to new API.
r6938 class TerminalMagics(Magics):
Fernando Perez
Properly clean up input for interactive pasting....
r7717 def __init__(self, shell):
super(TerminalMagics, self).__init__(shell)
Thomas Kluyver
Simplify InputSplitter by stripping out input_mode distinction
r10251 self.input_splitter = IPythonInputSplitter()
Fernando Perez
Properly clean up input for interactive pasting....
r7717
Fernando Perez
Move functions into magic methods....
r7661 def store_or_execute(self, block, name):
""" Execute a block, or store it in a variable, per the user's request.
"""
if name:
Fernando Perez
Properly clean up input for interactive pasting....
r7717 # If storing it for further editing
Thomas Kluyver
Use new input transformation API in %paste...
r10753 self.shell.user_ns[name] = SList(block.splitlines())
Matthias BUSSONNIER
use print function in module with `print >>`
r7817 print("Block assigned to '%s'" % name)
Fernando Perez
Move functions into magic methods....
r7661 else:
Thomas Kluyver
Refactor paste magics and ipdoctest
r10754 b = self.preclean_input(block)
self.shell.user_ns['pasted_block'] = b
mr.Shu
Minor updates to reflect comments
r8972 self.shell.using_paste_magics = True
mr.Shu
Added try/finally block to set using_paste_magics
r8975 try:
self.shell.run_cell(b)
finally:
self.shell.using_paste_magics = False
Thomas Kluyver
Refactor paste magics and ipdoctest
r10754
def preclean_input(self, block):
lines = block.splitlines()
while lines and not lines[0].strip():
lines = lines[1:]
return strip_email_quotes('\n'.join(lines))
Fernando Perez
Move functions into magic methods....
r7661
def rerun_pasted(self, name='pasted_block'):
""" Rerun a previously pasted command.
"""
b = self.shell.user_ns.get(name)
# Sanity checks
if b is None:
raise UsageError('No previous pasted block available')
Thomas Kluyver
Replace references to unicode and basestring
r13353 if not isinstance(b, py3compat.string_types):
Fernando Perez
Move functions into magic methods....
r7661 raise UsageError(
"Variable 'pasted_block' is not a string, can't execute")
Matthias BUSSONNIER
use print function in module with `print >>`
r7817 print("Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b)))
Fernando Perez
Move functions into magic methods....
r7661 self.shell.run_cell(b)
Fernando Perez
Update terminal-only magics to new API.
r6938 @line_magic
def autoindent(self, parameter_s = ''):
"""Toggle autoindent on/off (if available)."""
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 self.shell.set_autoindent()
Matthias BUSSONNIER
use print function in module with `print >>`
r7817 print("Automatic indentation is:",['OFF','ON'][self.shell.autoindent])
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 @line_magic
def cpaste(self, parameter_s=''):
"""Paste & execute a pre-formatted code block from clipboard.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 You must terminate the block with '--' (two minus-signs) or Ctrl-D
alone on the line. You can also provide your own sentinel with '%paste
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 -s %%' ('%%' is the new sentinel for this operation).
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 The block is dedented prior to execution to enable execution of method
definitions. '>' and '+' characters at the beginning of a line are
ignored, to allow pasting directly from e-mails, diff files and
doctests (the '...' continuation prompt is also stripped). The
executed block is also assigned to variable named 'pasted_block' for
later editing with '%edit pasted_block'.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
This assigns the pasted block to variable 'foo' as string, without
dedenting or executing it (preceding >>> and + is still stripped)
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 '%cpaste -r' re-executes the block previously entered by cpaste.
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 '%cpaste -q' suppresses any additional output messages.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 Do not be alarmed by garbled output on Windows (it's a readline bug).
Just press enter and type -- (and press enter again) and the block
will be what was just pasted.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 IPython statements (magics, shell escapes) are not supported (yet).
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 See also
--------
paste: automatically pull code from clipboard.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 Examples
--------
::
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 In [8]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:>>> a = ["world!", "Hello"]
:>>> print " ".join(sorted(a))
:--
Hello world!
"""
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 opts, name = self.parse_options(parameter_s, 'rqs:', mode='string')
Fernando Perez
Update terminal-only magics to new API.
r6938 if 'r' in opts:
Fernando Perez
Move functions into magic methods....
r7661 self.rerun_pasted()
Fernando Perez
Update terminal-only magics to new API.
r6938 return
Fernando Perez
Fix remaining test failures....
r6916
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 quiet = ('q' in opts)
Thomas Kluyver
Convert cpasted code to unicode on Python 2...
r20327 sentinel = opts.get('s', u'--')
Arun Persaud
added a quiet option to %cpaste to suppress output...
r13774 block = '\n'.join(get_pasted_lines(sentinel, quiet=quiet))
Fernando Perez
Move functions into magic methods....
r7661 self.store_or_execute(block, name)
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 @line_magic
def paste(self, parameter_s=''):
"""Paste & execute a pre-formatted code block from clipboard.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 The text is pulled directly from the clipboard without user
intervention and printed back on the screen before execution (unless
the -q flag is given to force quiet mode).
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 The block is dedented prior to execution to enable execution of method
definitions. '>' and '+' characters at the beginning of a line are
ignored, to allow pasting directly from e-mails, diff files and
doctests (the '...' continuation prompt is also stripped). The
executed block is also assigned to variable named 'pasted_block' for
later editing with '%edit pasted_block'.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 You can also pass a variable name as an argument, e.g. '%paste foo'.
This assigns the pasted block to variable 'foo' as string, without
Fernando Perez
Properly clean up input for interactive pasting....
r7717 executing it (preceding >>> and + is still stripped).
Fernando Perez
Fix remaining test failures....
r6916
Thomas Kluyver
Clean up numpydoc section headers
r13587 Options:
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 -r: re-executes the block previously entered by cpaste.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 -q: quiet mode: do not echo the pasted text back to the terminal.
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 IPython statements (magics, shell escapes) are not supported (yet).
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 See also
--------
cpaste: manually paste code into terminal until you mark its end.
"""
opts, name = self.parse_options(parameter_s, 'rq', mode='string')
if 'r' in opts:
Fernando Perez
Move functions into magic methods....
r7661 self.rerun_pasted()
Fernando Perez
Update terminal-only magics to new API.
r6938 return
try:
Fernando Perez
Properly clean up input for interactive pasting....
r7717 block = self.shell.hooks.clipboard_get()
Fernando Perez
Update terminal-only magics to new API.
r6938 except TryNext as clipboard_exc:
message = getattr(clipboard_exc, 'args')
if message:
error(message[0])
else:
error('Could not get text from the clipboard.')
return
Thomas Kluyver
Better clipboard handling, esp. with pywin32...
r13426 except ClipboardEmpty:
raise UsageError("The clipboard appears to be empty")
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 # By default, echo back to terminal unless quiet mode is requested
if 'q' not in opts:
write = self.shell.write
write(self.shell.pycolorize(block))
if not block.endswith('\n'):
write('\n')
write("## -- End pasted text --\n")
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Move functions into magic methods....
r7661 self.store_or_execute(block, name)
Fernando Perez
Fix remaining test failures....
r6916
Fernando Perez
Update terminal-only magics to new API.
r6938 # Class-level: add a '%cls' magic only on Windows
if sys.platform == 'win32':
@line_magic
def cls(self, s):
"""Clear screen.
"""
os.system("cls")
Fernando Perez
Fix remaining test failures....
r6916
Brian Granger
Complete reorganization of InteractiveShell....
r2761
class TerminalInteractiveShell(InteractiveShell):
MinRK
Terminal IPython working with newapp
r3963 autoedit_syntax = CBool(False, config=True,
help="auto editing of files with syntax errors.")
confirm_exit = CBool(True, config=True,
help="""
Set to confirm when you try to exit IPython with an EOF (Control-D
MinRK
minor helpstring cleanup per review.
r3967 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
you can force a direct exit without any confirmation.""",
MinRK
Terminal IPython working with newapp
r3963 )
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # This display_banner only controls whether or not self.show_banner()
# is called when mainloop/interact are called. The default is False
# because for the terminal based application, the banner behavior
MinRK
move banner to base InteractiveShell class
r16581 # is controlled by the application.
Brian Granger
Complete reorganization of InteractiveShell....
r2761 display_banner = CBool(False) # This isn't configurable!
embedded = CBool(False)
embedded_active = CBool(False)
MinRK
Terminal IPython working with newapp
r3963 editor = Unicode(get_default_editor(), config=True,
help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
)
pager = Unicode('less', config=True,
help="The shell program to be used for paging.")
MinRK
add Integer traitlet...
r5344 screen_length = Integer(0, config=True,
MinRK
Terminal IPython working with newapp
r3963 help=
"""Number of lines of your screen, used to control printing of very
long strings. Strings longer than this number of lines will be sent
through a pager instead of directly printed. The default value for
this is 0, which means IPython will auto-detect your screen size every
time it needs to print certain potentially long strings (this doesn't
change the behavior of the 'print' keyword, it's only triggered
internally). If for some reason this isn't working well (it needs
curses support), specify it yourself. Otherwise don't change the
default.""",
)
term_title = CBool(False, config=True,
help="Enable auto setting the terminal title."
)
MinRK
move banner to base InteractiveShell class
r16581 usage = Unicode(interactive_usage)
mr.Shu
Minor updates to reflect comments
r8972
# This `using_paste_magics` is used to detect whether the code is being
# executed via paste magics functions
using_paste_magics = CBool(False)
mr.Shu
Don't show 'try %paste' message while using magics...
r8968
Fernando Perez
Move zmq event loop support into a separate file....
r5470 # In the terminal, GUI control is done via PyOS_InputHook
Thomas Kluyver
Make enable_gui a staticmethod again
r9404 @staticmethod
Thomas Kluyver
Defer import of IPython.lib.inputhook
r9394 def enable_gui(gui=None, app=None):
"""Switch amongst GUI input hooks by name.
"""
# Deferred import
from IPython.lib.inputhook import enable_gui as real_enable_gui
MinRK
raise UsageError for unsupported GUI backends...
r11319 try:
return real_enable_gui(gui, app)
except ValueError as e:
raise UsageError("%s" % e)
Fernando Perez
Move zmq event loop support into a separate file....
r5470
MinRK
move banner to base InteractiveShell class
r16581 system = InteractiveShell.system_raw
Brian Granger
Complete reorganization of InteractiveShell....
r2761
#-------------------------------------------------------------------------
MinRK
set default active_types to plaintext only in terminal IPython
r9812 # Overrides of init stages
#-------------------------------------------------------------------------
def init_display_formatter(self):
super(TerminalInteractiveShell, self).init_display_formatter()
# terminal only supports plaintext
self.display_formatter.active_types = ['text/plain']
#-------------------------------------------------------------------------
Thomas Kluyver
Move most readline code from InteractiveShell to terminal subclass...
r21846 # Things related to readline
#-------------------------------------------------------------------------
def init_readline(self):
"""Command history completion/saving/reloading."""
if self.readline_use:
import IPython.utils.rlineimpl as readline
self.rl_next_input = None
self.rl_do_indent = False
if not self.readline_use or not readline.have_readline:
self.readline = None
# Set a number of methods that depend on readline to be no-op
self.readline_no_record = NoOpContext()
self.set_readline_completer = no_op
self.set_custom_completer = no_op
if self.readline_use:
warn('Readline services not available or not loaded.')
else:
self.has_readline = True
self.readline = readline
sys.modules['readline'] = readline
# Platform-specific configuration
if os.name == 'nt':
# FIXME - check with Frederick to see if we can harmonize
# naming conventions with pyreadline to avoid this
# platform-dependent check
self.readline_startup_hook = readline.set_pre_input_hook
else:
self.readline_startup_hook = readline.set_startup_hook
# Readline config order:
# - IPython config (default value)
# - custom inputrc
# - IPython config (user customized)
# load IPython config before inputrc if default
# skip if libedit because parse_and_bind syntax is different
if not self._custom_readline_config and not readline.uses_libedit:
for rlcommand in self.readline_parse_and_bind:
readline.parse_and_bind(rlcommand)
# Load user's initrc file (readline config)
# Or if libedit is used, load editrc.
inputrc_name = os.environ.get('INPUTRC')
if inputrc_name is None:
inputrc_name = '.inputrc'
if readline.uses_libedit:
inputrc_name = '.editrc'
inputrc_name = os.path.join(self.home_dir, inputrc_name)
if os.path.isfile(inputrc_name):
try:
readline.read_init_file(inputrc_name)
except:
warn('Problems reading readline initialization file <%s>'
% inputrc_name)
# load IPython config after inputrc if user has customized
if self._custom_readline_config:
for rlcommand in self.readline_parse_and_bind:
readline.parse_and_bind(rlcommand)
# Remove some chars from the delimiters list. If we encounter
# unicode chars, discard them.
delims = readline.get_completer_delims()
if not py3compat.PY3:
delims = delims.encode("ascii", "ignore")
for d in self.readline_remove_delims:
delims = delims.replace(d, "")
delims = delims.replace(ESC_MAGIC, '')
readline.set_completer_delims(delims)
# Store these so we can restore them if something like rpy2 modifies
# them.
self.readline_delims = delims
# otherwise we end up with a monster history after a while:
readline.set_history_length(self.history_length)
self.refill_readline_hist()
self.readline_no_record = ReadlineNoRecord(self)
# Configure auto-indent for all platforms
self.set_autoindent(self.autoindent)
def init_completer(self):
super(TerminalInteractiveShell, self).init_completer()
# Only configure readline if we truly are using readline.
if self.has_readline:
self.set_readline_completer()
def set_readline_completer(self):
"""Reset readline's completer to be our own."""
self.readline.set_completer(self.Completer.rlcomplete)
def pre_readline(self):
"""readline hook to be used at the start of each line.
It handles auto-indent and text from set_next_input."""
if self.rl_do_indent:
self.readline.insert_text(self._indent_current_str())
if self.rl_next_input is not None:
self.readline.insert_text(self.rl_next_input)
self.rl_next_input = None
def refill_readline_hist(self):
# Load the last 1000 lines from history
self.readline.clear_history()
stdin_encoding = sys.stdin.encoding or "utf-8"
last_cell = u""
for _, _, cell in self.history_manager.get_tail(self.history_load_length,
include_latest=True):
# Ignore blank lines and consecutive duplicates
cell = cell.rstrip()
if cell and (cell != last_cell):
try:
if self.multiline_history:
self.readline.add_history(py3compat.unicode_to_str(cell,
stdin_encoding))
else:
for line in cell.splitlines():
self.readline.add_history(py3compat.unicode_to_str(line,
stdin_encoding))
last_cell = cell
except TypeError:
# The history DB can get corrupted so it returns strings
# containing null bytes, which readline objects to.
continue
#-------------------------------------------------------------------------
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # Things related to the terminal
#-------------------------------------------------------------------------
@property
def usable_screen_length(self):
if self.screen_length == 0:
return 0
else:
num_lines_bot = self.separate_in.count('\n')+1
return self.screen_length - num_lines_bot
MinRK
move banner to base InteractiveShell class
r16581 def _term_title_changed(self, name, new_value):
self.init_term_title()
Brian Granger
Complete reorganization of InteractiveShell....
r2761 def init_term_title(self):
# Enable or disable the terminal title.
if self.term_title:
toggle_set_term_title(True)
set_term_title('IPython: ' + abbrev_cwd())
else:
toggle_set_term_title(False)
#-------------------------------------------------------------------------
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003 # Things related to aliases
#-------------------------------------------------------------------------
def init_alias(self):
# The parent class defines aliases that can be safely used with any
# frontend.
super(TerminalInteractiveShell, self).init_alias()
# Now define aliases that only make sense on the terminal, because they
# need direct access to the console in a way that we can't emulate in
# GUI or web frontend
if os.name == 'posix':
aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
('man', 'man')]
Matthias BUSSONNIER
alway define aliases, even if empty...
r14054 else :
aliases = []
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003
for name, cmd in aliases:
Thomas Kluyver
Remove alias_table
r12601 self.alias_manager.soft_define_alias(name, cmd)
Fernando Perez
Aliases fixes: ls alias improvements and frontend-dependent fixes....
r3003
#-------------------------------------------------------------------------
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # Mainloop and code execution logic
#-------------------------------------------------------------------------
def mainloop(self, display_banner=None):
"""Start the mainloop.
If an optional banner argument is given, it will override the
internally created default banner.
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Drop nested() function for context managers
r12148 with self.builtin_trap, self.display_trap:
Brian Granger
Complete reorganization of InteractiveShell....
r2761
while 1:
try:
self.interact(display_banner=display_banner)
Bernardo B. Marques
remove all trailling spaces
r4872 #self.interact_with_readline()
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # XXX for testing of a readline-decoupled repl loop, call
# interact_with_readline above
break
except KeyboardInterrupt:
# this should not be necessary, but KeyboardInterrupt
# handling seems rather unpredictable...
self.write("\nKeyboardInterrupt in interact()\n")
Julian Taylor
clarify variable names
r5013 def _replace_rlhist_multiline(self, source_raw, hlen_before_cell):
Julian Taylor
reenable multiline history for terminals...
r5011 """Store multiple lines as a single entry in history"""
Julian Taylor
don't try to replace history when rl history unchanged...
r5254
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 # do nothing without readline or disabled multiline
if not self.has_readline or not self.multiline_history:
return hlen_before_cell
Julian Taylor
don't try to replace history when rl history unchanged...
r5254
Julian Taylor
_replace_rlhist_multiline: check if remove_history_item is available
r5273 # windows rl has no remove_history_item
if not hasattr(self.readline, "remove_history_item"):
return hlen_before_cell
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 # skip empty cells
if not source_raw.rstrip():
return hlen_before_cell
# nothing changed do nothing, e.g. when rl removes consecutive dups
hlen = self.readline.get_current_history_length()
if hlen == hlen_before_cell:
Julian Taylor
fix indentation
r5270 return hlen_before_cell
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269
for i in range(hlen - hlen_before_cell):
self.readline.remove_history_item(hlen - i - 1)
Brandon Parsons
Feedback from pull request #1245
r6655 stdin_encoding = get_stream_enc(sys.stdin, 'utf-8')
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 self.readline.add_history(py3compat.unicode_to_str(source_raw.rstrip(),
stdin_encoding))
return self.readline.get_current_history_length()
Julian Taylor
reenable multiline history for terminals...
r5011
Brian Granger
Complete reorganization of InteractiveShell....
r2761 def interact(self, display_banner=None):
"""Closely emulate the interactive Python console."""
Bernardo B. Marques
remove all trailling spaces
r4872 # batch run -> do not interact
Brian Granger
Complete reorganization of InteractiveShell....
r2761 if self.exit_now:
return
if display_banner is None:
display_banner = self.display_banner
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Replace references to unicode and basestring
r13353 if isinstance(display_banner, py3compat.string_types):
MinRK
respect banner argument in TerminalInteractiveShell.interact...
r4210 self.show_banner(display_banner)
elif display_banner:
Brian Granger
Complete reorganization of InteractiveShell....
r2761 self.show_banner()
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 more = False
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Complete reorganization of InteractiveShell....
r2761 if self.has_readline:
self.readline_startup_hook(self.pre_readline)
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 hlen_b4_cell = self.readline.get_current_history_length()
Julian Taylor
initialize hlen_b4_cell also in the no readline case
r5272 else:
hlen_b4_cell = 0
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # exit_now is set by a call to %Exit or %Quit, through the
# ask_exit callback.
Fernando Perez
Refactor multiline input and prompt management.
r3077
Brian Granger
Complete reorganization of InteractiveShell....
r2761 while not self.exit_now:
self.hooks.pre_prompt_hook()
if more:
try:
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 prompt = self.prompt_manager.render('in2')
Brian Granger
Complete reorganization of InteractiveShell....
r2761 except:
self.showtraceback()
if self.autoindent:
self.rl_do_indent = True
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Complete reorganization of InteractiveShell....
r2761 else:
try:
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 prompt = self.separate_in + self.prompt_manager.render('in')
Brian Granger
Complete reorganization of InteractiveShell....
r2761 except:
self.showtraceback()
try:
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 line = self.raw_input(prompt)
Brian Granger
Complete reorganization of InteractiveShell....
r2761 if self.exit_now:
# quick exit on sys.std[in|out] close
break
if self.autoindent:
self.rl_do_indent = False
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Complete reorganization of InteractiveShell....
r2761 except KeyboardInterrupt:
#double-guard against keyboardinterrupts during kbdint handling
try:
Jeroen Demeyer
Print exception instead of "KeyboardInterrupt"...
r19114 self.write('\n' + self.get_exception_only())
Thomas Kluyver
Simplify IPythonInputSplitter API
r13912 source_raw = self.input_splitter.raw_reset()
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 hlen_b4_cell = \
self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 more = False
Brian Granger
Complete reorganization of InteractiveShell....
r2761 except KeyboardInterrupt:
pass
except EOFError:
if self.autoindent:
self.rl_do_indent = False
if self.has_readline:
self.readline_startup_hook(None)
self.write('\n')
self.exit()
except bdb.BdbQuit:
warn('The Python debugger has exited with a BdbQuit exception.\n'
'Because of how pdb handles the stack, it is impossible\n'
'for IPython to properly format this particular exception.\n'
'IPython will resume normal operation.')
except:
# exceptions here are VERY RARE, but they can be triggered
# asynchronously by signal handlers, for example.
self.showtraceback()
else:
Volker Braun
Allow InputTransformers to raise SyntaxErrors...
r13522 try:
self.input_splitter.push(line)
more = self.input_splitter.push_accepts_more()
except SyntaxError:
Thomas Kluyver
Don't clear input if InputTransformer raises SyntaxError.
r13527 # Run the code directly - run_cell takes care of displaying
# the exception.
Volker Braun
Allow InputTransformers to raise SyntaxErrors...
r13522 more = False
Brian Granger
Complete reorganization of InteractiveShell....
r2761 if (self.SyntaxTB.last_syntax_error and
self.autoedit_syntax):
self.edit_syntax_error()
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 if not more:
Thomas Kluyver
Simplify IPythonInputSplitter API
r13912 source_raw = self.input_splitter.raw_reset()
Thomas Kluyver
Change run_cell to not store history by default.
r4995 self.run_cell(source_raw, store_history=True)
Julian Taylor
make hlen_before_cell a function argument instead of class member
r5269 hlen_b4_cell = \
self._replace_rlhist_multiline(source_raw, hlen_b4_cell)
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # Turn off the exit flag, so the mainloop can be restarted if desired
self.exit_now = False
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 def raw_input(self, prompt=''):
"""Write a prompt and read a line.
The returned line does not include the trailing newline.
When the user enters the EOF key sequence, EOFError is raised.
Thomas Kluyver
Various docs fixes
r13595 Parameters
----------
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080
Thomas Kluyver
Various docs fixes
r13595 prompt : str, optional
A string to be printed to prompt the user.
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 """
MinRK
allow unicode in Shell.raw_input
r7572 # raw_input expects str, but we pass it unicode sometimes
prompt = py3compat.cast_bytes_py2(prompt)
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 try:
Drekin
Support unicode returned by raw_input...
r21554 line = py3compat.cast_unicode_py2(self.raw_input_original(prompt))
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 except ValueError:
warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
MinRK
allow unicode in Shell.raw_input
r7572 " or sys.stdout.close()!\nExiting IPython!\n")
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 self.ask_exit()
return ""
# Try to be reasonably smart about not re-indenting pasted input more
# than necessary. We do this by trimming out the auto-indent initial
# spaces, if the user's actual input started itself with whitespace.
if self.autoindent:
if num_ini_spaces(line) > self.indent_current_nsp:
line = line[self.indent_current_nsp:]
self.indent_current_nsp = 0
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Add support for accessing raw data to inputsplitter....
r3080 return line
Brian Granger
Complete reorganization of InteractiveShell....
r2761 #-------------------------------------------------------------------------
# Methods to support auto-editing of SyntaxErrors.
#-------------------------------------------------------------------------
def edit_syntax_error(self):
"""The bottom half of the syntax error handler called in the main loop.
Loop until syntax error is fixed or user cancels.
"""
while self.SyntaxTB.last_syntax_error:
# copy and clear last_syntax_error
err = self.SyntaxTB.clear_err_state()
if not self._should_recompile(err):
return
try:
# may set last_syntax_error again if a SyntaxError is raised
self.safe_execfile(err.filename,self.user_ns)
except:
self.showtraceback()
else:
try:
Brandon Parsons
substitute open(...) for file(...)...
r6650 f = open(err.filename)
Brian Granger
Complete reorganization of InteractiveShell....
r2761 try:
Bernardo B. Marques
remove all trailling spaces
r4872 # This should be inside a display_trap block and I
Brian Granger
Complete reorganization of InteractiveShell....
r2761 # think it is.
sys.displayhook(f.read())
finally:
f.close()
except:
self.showtraceback()
def _should_recompile(self,e):
"""Utility routine for edit_syntax_error"""
if e.filename in ('<ipython console>','<input>','<string>',
'<console>','<BackgroundJob compilation>',
None):
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Complete reorganization of InteractiveShell....
r2761 return False
try:
Bernardo B. Marques
remove all trailling spaces
r4872 if (self.autoedit_syntax and
Brian Granger
Complete reorganization of InteractiveShell....
r2761 not self.ask_yes_no('Return to editor to correct syntax error? '
'[Y/n] ','y')):
return False
except EOFError:
return False
def int0(x):
try:
return int(x)
except TypeError:
return 0
# always pass integer line and offset values to editor hook
try:
self.hooks.fix_error_editor(e.filename,
int0(e.lineno),int0(e.offset),e.msg)
except TryNext:
warn('Could not open editor')
return False
return True
#-------------------------------------------------------------------------
# Things related to exiting
#-------------------------------------------------------------------------
def ask_exit(self):
""" Ask the shell to exit. Can be overiden and used as a callback. """
self.exit_now = True
def exit(self):
"""Handle interactive exit.
This method calls the ask_exit callback."""
if self.confirm_exit:
Yuri Numerov
fixed exit confirmation glitch
r21622 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y','n'):
Brian Granger
Complete reorganization of InteractiveShell....
r2761 self.ask_exit()
else:
self.ask_exit()
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fix remaining test failures....
r6916 #-------------------------------------------------------------------------
# Things related to magics
#-------------------------------------------------------------------------
Fernando Perez
Move terminal-only magics to the terminal class....
r2975
Fernando Perez
Fix remaining test failures....
r6916 def init_magics(self):
super(TerminalInteractiveShell, self).init_magics()
Fernando Perez
Update terminal-only magics to new API.
r6938 self.register_magics(TerminalMagics)
Jörgen Stenarson
Moving magic_cls to TerminalInteractiveShell.
r5165
Thomas Kluyver
Only tell the user about %paste in the terminal shell.
r4226 def showindentationerror(self):
super(TerminalInteractiveShell, self).showindentationerror()
mr.Shu
fixed variable name change
r8973 if not self.using_paste_magics:
mr.Shu
Don't show 'try %paste' message while using magics...
r8968 print("If you want to paste code into IPython, try the "
"%paste and %cpaste magic functions.")
Brian Granger
Complete reorganization of InteractiveShell....
r2761
InteractiveShellABC.register(TerminalInteractiveShell)