From 5171381514c4f88cc7ca5f52e6eac7cf4fe57c29 2010-08-20 18:23:35 From: Brian Granger Date: 2010-08-20 18:23:35 Subject: [PATCH] Paging using payloads now works. --- diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py index e5a4a79..711b2f9 100644 --- a/IPython/core/interactiveshell.py +++ b/IPython/core/interactiveshell.py @@ -1901,9 +1901,6 @@ class InteractiveShell(Configurable, Magic): - 1: an error occurred. """ - # Clear the payload before executing new code. - self.payload_manager.clear_payload() - # Set our own excepthook in case the user code tries to call it # directly, so that the IPython crash handler doesn't get triggered old_excepthook,sys.excepthook = sys.excepthook, self.excepthook diff --git a/IPython/core/magic.py b/IPython/core/magic.py index d5ef5d4..aff9523 100644 --- a/IPython/core/magic.py +++ b/IPython/core/magic.py @@ -52,7 +52,7 @@ from IPython.core.error import TryNext from IPython.core.error import UsageError from IPython.core.fakemodule import FakeModule from IPython.core.macro import Macro -from IPython.core.page import page +from IPython.core import page from IPython.core.prefilter import ESC_MAGIC from IPython.lib.pylabtools import mpl_runner from IPython.lib.inputhook import enable_gui @@ -514,7 +514,7 @@ Currently the magic system has the following functions:\n""" (' '+mesc).join(self.lsmagic()), Magic.auto_status[self.shell.automagic] ) ) - page(outmsg,screen_lines=self.shell.usable_screen_length) + page.page(outmsg,screen_lines=self.shell.usable_screen_length) def magic_autoindent(self, parameter_s = ''): @@ -656,7 +656,7 @@ Currently the magic system has the following functions:\n""" info = self._ofind(oname) if info['found']: txt = (raw and str or pformat)( info['obj'] ) - page(txt) + page.page(txt) else: print 'Object `%s` not found' % oname @@ -727,7 +727,7 @@ Currently the magic system has the following functions:\n""" except IOError,msg: print msg return - page(self.shell.inspector.format(file(filename).read())) + page.page(self.shell.inspector.format(file(filename).read())) def _inspect(self,meth,oname,namespaces=None,**kw): """Generic interface to the inspector system. @@ -1520,7 +1520,7 @@ Currently the magic system has the following functions:\n""" output = stdout_trap.getvalue() output = output.rstrip() - page(output,screen_lines=self.shell.usable_screen_length) + page.page(output,screen_lines=self.shell.usable_screen_length) print sys_exit, dump_file = opts.D[0] @@ -3256,7 +3256,7 @@ Defaulting color scheme to 'NoColor'""" print "Error: no such file or variable" return - page(self.shell.pycolorize(cont), + page.page(self.shell.pycolorize(cont), screen_lines=self.shell.usable_screen_length) def _rerun_pasted(self): @@ -3413,7 +3413,7 @@ Defaulting color scheme to 'NoColor'""" import IPython.core.usage qr = IPython.core.usage.quick_reference + self.magic_magic('-brief') - page(qr) + page.page(qr) def magic_doctest_mode(self,parameter_s=''): """Toggle doctest mode on and off. diff --git a/IPython/core/oinspect.py b/IPython/core/oinspect.py index 723acae..5d19236 100644 --- a/IPython/core/oinspect.py +++ b/IPython/core/oinspect.py @@ -27,7 +27,7 @@ import sys import types # IPython's own -from IPython.core.page import page +from IPython.core import page from IPython.external.Itpl import itpl from IPython.utils import PyColorize import IPython.utils.io @@ -281,7 +281,7 @@ class Inspector: if output is None: self.noinfo('documentation',oname) return - page(output) + page.page(output) def psource(self,obj,oname=''): """Print the source code for an object.""" @@ -293,7 +293,7 @@ class Inspector: except: self.noinfo('source',oname) else: - page(self.format(src)) + page.page(self.format(src)) def pfile(self,obj,oname=''): """Show the whole file where an object was defined.""" @@ -325,7 +325,7 @@ class Inspector: # Print only text files, not extension binaries. Note that # getsourcelines returns lineno with 1-offset and page() uses # 0-offset, so we must adjust. - page(self.format(open(ofile).read()),lineno-1) + page.page(self.format(open(ofile).read()),lineno-1) def pinfo(self,obj,oname='',formatter=None,info=None,detail_level=0): """Show detailed information about an object. @@ -548,7 +548,7 @@ class Inspector: # Finally send to printer/pager output = out.getvalue() if output: - page(output) + page.page(output) # end pinfo def psearch(self,pattern,ns_table,ns_search=[], @@ -606,4 +606,4 @@ class Inspector: search_result.extend(tmp_res) search_result.sort() - page('\n'.join(search_result)) + page.page('\n'.join(search_result)) diff --git a/IPython/core/payloadpage.py b/IPython/core/payloadpage.py new file mode 100644 index 0000000..2ec73e2 --- /dev/null +++ b/IPython/core/payloadpage.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +A payload based version of page. + +Authors: + +* Brian Granger +* Fernando Perez +""" + +#----------------------------------------------------------------------------- +# Copyright (C) 2008-2010 The IPython Development Team +# +# Distributed under the terms of the BSD License. The full license is in +# the file COPYING, distributed as part of this software. +#----------------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- + +from IPython.core.interactiveshell import InteractiveShell + +#----------------------------------------------------------------------------- +# Classes and functions +#----------------------------------------------------------------------------- + +def page(strng, start=0, screen_lines=0, pager_cmd=None): + """Print a string, piping through a pager. + + This version ignores the screen_lines and pager_cmd arguments and uses + IPython's payload system instead. + """ + + # Some routines may auto-compute start offsets incorrectly and pass a + # negative value. Offset to 0 for robustness. + start = max(0, start) + shell = InteractiveShell.instance() + payload = dict( + source='IPython.zmq.page.page', + data=strng, + start_line_number=start + ) + shell.payload_manager.write_payload(payload) + +def install_payload_page(): + """Install this version of page as IPython.core.page.page.""" + from IPython.core import page as corepage + corepage.page = page diff --git a/IPython/core/prefilter.py b/IPython/core/prefilter.py index 3c11767..45ac5ad 100755 --- a/IPython/core/prefilter.py +++ b/IPython/core/prefilter.py @@ -33,7 +33,7 @@ from IPython.core.alias import AliasManager from IPython.core.autocall import IPyAutocall from IPython.config.configurable import Configurable from IPython.core.splitinput import split_user_input -from IPython.core.page import page +from IPython.core import page from IPython.utils.traitlets import List, Int, Any, Str, CBool, Bool, Instance import IPython.utils.io @@ -960,7 +960,7 @@ class HelpHandler(PrefilterHandler): #print 'line:<%r>' % line # dbg self.shell.magic_pinfo(line) else: - page(self.shell.usage, screen_lines=self.shell.usable_screen_length) + page.page(self.shell.usage, screen_lines=self.shell.usable_screen_length) return '' # Empty string is needed here! except: raise diff --git a/IPython/deathrow/GnuplotInteractive.py b/IPython/deathrow/GnuplotInteractive.py index ab837d7..b528428 100644 --- a/IPython/deathrow/GnuplotInteractive.py +++ b/IPython/deathrow/GnuplotInteractive.py @@ -17,7 +17,7 @@ __all__ = ['Gnuplot','gp','gp_new','plot','plot2','splot','replot', import IPython.GnuplotRuntime as GRun from IPython.utils.genutils import warn -from IPython.core.page import page +from IPython.core import page # Set global names for interactive use Gnuplot = GRun.Gnuplot diff --git a/IPython/frontend/qt/console/rich_ipython_widget.py b/IPython/frontend/qt/console/rich_ipython_widget.py index 9b89c4b..66a5e68 100644 --- a/IPython/frontend/qt/console/rich_ipython_widget.py +++ b/IPython/frontend/qt/console/rich_ipython_widget.py @@ -98,6 +98,10 @@ class RichIPythonWidget(IPythonWidget): else: cmd = 'mate -l %s %s' % (line_number, filename) os.system(cmd) + elif item['source'] == 'IPython.zmq.page.page': + # TODO: This is probably a good place to start, but Evan can + # add better paging capabilities. + self._append_plain_text(item['data']) else: # Add other payload types here! pass diff --git a/IPython/zmq/zmqshell.py b/IPython/zmq/zmqshell.py index b1ddefa..6aaae9e 100644 --- a/IPython/zmq/zmqshell.py +++ b/IPython/zmq/zmqshell.py @@ -13,6 +13,11 @@ from IPython.utils.text import StringTypes from IPython.utils.traitlets import Instance, Type, Dict from IPython.utils.warn import warn from IPython.zmq.session import extract_header +from IPython.core.payloadpage import install_payload_page + + +# Install the payload version of page. +install_payload_page() class ZMQDisplayHook(DisplayHook):