##// END OF EJS Templates
Merge pull request #7009 from minrk/pinfo-no-page...
Jonathan Frederic -
r19400:cfa47335 merge
parent child Browse files
Show More
@@ -72,7 +72,7 b' from IPython.utils.strdispatch import StrDispatch'
72 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.syspathcontext import prepended_to_syspath
73 from IPython.utils.text import (format_screen, LSString, SList,
73 from IPython.utils.text import (format_screen, LSString, SList,
74 DollarFormatter)
74 DollarFormatter)
75 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
75 from IPython.utils.traitlets import (Integer, Bool, CBool, CaselessStrEnum, Enum,
76 List, Unicode, Instance, Type)
76 List, Unicode, Instance, Type)
77 from IPython.utils.warn import warn, error
77 from IPython.utils.warn import warn, error
78 import IPython.core.hooks
78 import IPython.core.hooks
@@ -334,6 +334,10 b' class InteractiveShell(SingletonConfigurable):'
334 multiline_history = CBool(sys.platform != 'win32', config=True,
334 multiline_history = CBool(sys.platform != 'win32', config=True,
335 help="Save multi-line entries as one entry in readline history"
335 help="Save multi-line entries as one entry in readline history"
336 )
336 )
337 display_page = Bool(False, config=True,
338 help="""If True, anything that would be passed to the pager
339 will be displayed as regular output instead."""
340 )
337
341
338 # deprecated prompt traits:
342 # deprecated prompt traits:
339
343
@@ -820,7 +824,10 b' class InteractiveShell(SingletonConfigurable):'
820 # default hooks have priority 100, i.e. low; user hooks should have
824 # default hooks have priority 100, i.e. low; user hooks should have
821 # 0-100 priority
825 # 0-100 priority
822 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
826 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
823
827
828 if self.display_page:
829 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
830
824 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
831 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
825 _warn_deprecated=True):
832 _warn_deprecated=True):
826 """set_hook(name,hook) -> sets an internal IPython hook.
833 """set_hook(name,hook) -> sets an internal IPython hook.
@@ -2,29 +2,17 b''
2 """
2 """
3 Paging capabilities for IPython.core
3 Paging capabilities for IPython.core
4
4
5 Authors:
6
7 * Brian Granger
8 * Fernando Perez
9
10 Notes
5 Notes
11 -----
6 -----
12
7
13 For now this uses ipapi, so it can't be in IPython.utils. If we can get
8 For now this uses IPython hooks, so it can't be in IPython.utils. If we can get
14 rid of that dependency, we could move it there.
9 rid of that dependency, we could move it there.
15 -----
10 -----
16 """
11 """
17
12
18 #-----------------------------------------------------------------------------
13 # Copyright (c) IPython Development Team.
19 # Copyright (C) 2008-2011 The IPython Development Team
14 # Distributed under the terms of the Modified BSD License.
20 #
21 # Distributed under the terms of the BSD License. The full license is in
22 # the file COPYING, distributed as part of this software.
23 #-----------------------------------------------------------------------------
24
15
25 #-----------------------------------------------------------------------------
26 # Imports
27 #-----------------------------------------------------------------------------
28 from __future__ import print_function
16 from __future__ import print_function
29
17
30 import os
18 import os
@@ -35,6 +23,7 b' import tempfile'
35 from io import UnsupportedOperation
23 from io import UnsupportedOperation
36
24
37 from IPython import get_ipython
25 from IPython import get_ipython
26 from IPython.core.display import display
38 from IPython.core.error import TryNext
27 from IPython.core.error import TryNext
39 from IPython.utils.data import chop
28 from IPython.utils.data import chop
40 from IPython.utils import io
29 from IPython.utils import io
@@ -43,9 +32,24 b' from IPython.utils.terminal import get_terminal_size'
43 from IPython.utils import py3compat
32 from IPython.utils import py3compat
44
33
45
34
46 #-----------------------------------------------------------------------------
35 def display_page(strng, start=0, screen_lines=25):
47 # Classes and functions
36 """Just display, no paging. screen_lines is ignored."""
48 #-----------------------------------------------------------------------------
37 if isinstance(strng, dict):
38 data = strng
39 else:
40 if start:
41 strng = u'\n'.join(strng.splitlines()[start:])
42 data = {'text/plain': strng}
43 display(data, raw=True)
44
45
46 def as_hook(page_func):
47 """Wrap a pager func to strip the `self` arg
48
49 so it can be called as a hook.
50 """
51 return lambda self, *args, **kwargs: page_func(*args, **kwargs)
52
49
53
50 esc_re = re.compile(r"(\x1b[^m]+m)")
54 esc_re = re.compile(r"(\x1b[^m]+m)")
51
55
@@ -132,7 +136,7 b' def _detect_screen_size(screen_lines_def):'
132 #print '***Screen size:',screen_lines_real,'lines x',\
136 #print '***Screen size:',screen_lines_real,'lines x',\
133 #screen_cols,'columns.' # dbg
137 #screen_cols,'columns.' # dbg
134
138
135 def page(strng, start=0, screen_lines=0, pager_cmd=None):
139 def pager_page(strng, start=0, screen_lines=0, pager_cmd=None):
136 """Display a string, piping through a pager after a certain length.
140 """Display a string, piping through a pager after a certain length.
137
141
138 strng can be a mime-bundle dict, supplying multiple representations,
142 strng can be a mime-bundle dict, supplying multiple representations,
@@ -160,19 +164,6 b' def page(strng, start=0, screen_lines=0, pager_cmd=None):'
160 if isinstance(strng, dict):
164 if isinstance(strng, dict):
161 strng = strng['text/plain']
165 strng = strng['text/plain']
162
166
163 # Some routines may auto-compute start offsets incorrectly and pass a
164 # negative value. Offset to 0 for robustness.
165 start = max(0, start)
166
167 # first, try the hook
168 ip = get_ipython()
169 if ip:
170 try:
171 ip.hooks.show_in_pager(strng)
172 return
173 except TryNext:
174 pass
175
176 # Ugly kludge, but calling curses.initscr() flat out crashes in emacs
167 # Ugly kludge, but calling curses.initscr() flat out crashes in emacs
177 TERM = os.environ.get('TERM','dumb')
168 TERM = os.environ.get('TERM','dumb')
178 if TERM in ['dumb','emacs'] and os.name != 'nt':
169 if TERM in ['dumb','emacs'] and os.name != 'nt':
@@ -252,6 +243,32 b' def page(strng, start=0, screen_lines=0, pager_cmd=None):'
252 page_dumb(strng,screen_lines=screen_lines)
243 page_dumb(strng,screen_lines=screen_lines)
253
244
254
245
246 def page(data, start=0, screen_lines=0, pager_cmd=None):
247 """Display content in a pager, piping through a pager after a certain length.
248
249 data can be a mime-bundle dict, supplying multiple representations,
250 keyed by mime-type, or text.
251
252 Pager is dispatched via the `show_in_pager` IPython hook.
253 If no hook is registered, `pager_page` will be used.
254 """
255 # Some routines may auto-compute start offsets incorrectly and pass a
256 # negative value. Offset to 0 for robustness.
257 start = max(0, start)
258
259 # first, try the hook
260 ip = get_ipython()
261 if ip:
262 try:
263 ip.hooks.show_in_pager(data, start=start, screen_lines=screen_lines)
264 return
265 except TryNext:
266 pass
267
268 # fallback on default pager
269 return pager_page(data, start, screen_lines, pager_cmd)
270
271
255 def page_file(fname, start=0, pager_cmd=None):
272 def page_file(fname, start=0, pager_cmd=None):
256 """Page a file, using an optional pager command and starting line.
273 """Page a file, using an optional pager command and starting line.
257 """
274 """
@@ -4,11 +4,9 b''
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7 import warnings
7 from IPython.core.getipython import get_ipython
8 from IPython.core.getipython import get_ipython
8
9
9 #-----------------------------------------------------------------------------
10 # Classes and functions
11 #-----------------------------------------------------------------------------
12
10
13 def page(strng, start=0, screen_lines=0, pager_cmd=None):
11 def page(strng, start=0, screen_lines=0, pager_cmd=None):
14 """Print a string, piping through a pager.
12 """Print a string, piping through a pager.
@@ -43,6 +41,12 b' def page(strng, start=0, screen_lines=0, pager_cmd=None):'
43
41
44
42
45 def install_payload_page():
43 def install_payload_page():
46 """Install this version of page as IPython.core.page.page."""
44 """DEPRECATED, use show_in_pager hook
45
46 Install this version of page as IPython.core.page.page.
47 """
48 warnings.warn("""install_payload_page is deprecated.
49 Use `ip.set_hook('show_in_pager, page.as_hook(payloadpage.page))`
50 """)
47 from IPython.core import page as corepage
51 from IPython.core import page as corepage
48 corepage.page = page
52 corepage.page = page
@@ -31,7 +31,7 b' from IPython.core.displaypub import DisplayPublisher'
31 from IPython.core.error import UsageError
31 from IPython.core.error import UsageError
32 from IPython.core.magics import MacroToEdit, CodeMagics
32 from IPython.core.magics import MacroToEdit, CodeMagics
33 from IPython.core.magic import magics_class, line_magic, Magics
33 from IPython.core.magic import magics_class, line_magic, Magics
34 from IPython.core.payloadpage import install_payload_page
34 from IPython.core import payloadpage
35 from IPython.core.usage import default_gui_banner
35 from IPython.core.usage import default_gui_banner
36 from IPython.display import display, Javascript
36 from IPython.display import display, Javascript
37 from IPython.kernel.inprocess.socket import SocketABC
37 from IPython.kernel.inprocess.socket import SocketABC
@@ -391,9 +391,7 b' class ZMQInteractiveShell(InteractiveShell):'
391 raise UsageError("%s" % e)
391 raise UsageError("%s" % e)
392
392
393 def init_environment(self):
393 def init_environment(self):
394 """Configure the user's environment.
394 """Configure the user's environment."""
395
396 """
397 env = os.environ
395 env = os.environ
398 # These two ensure 'ls' produces nice coloring on BSD-derived systems
396 # These two ensure 'ls' produces nice coloring on BSD-derived systems
399 env['TERM'] = 'xterm-color'
397 env['TERM'] = 'xterm-color'
@@ -403,10 +401,11 b' class ZMQInteractiveShell(InteractiveShell):'
403 # subprocesses as much as possible.
401 # subprocesses as much as possible.
404 env['PAGER'] = 'cat'
402 env['PAGER'] = 'cat'
405 env['GIT_PAGER'] = 'cat'
403 env['GIT_PAGER'] = 'cat'
406
404
407 # And install the payload version of page.
405 def init_hooks(self):
408 install_payload_page()
406 super(ZMQInteractiveShell, self).init_hooks()
409
407 self.set_hook('show_in_pager', page.as_hook(payloadpage.page), 99)
408
410 def ask_exit(self):
409 def ask_exit(self):
411 """Engage the exit actions."""
410 """Engage the exit actions."""
412 self.exit_now = (not self.keepkernel_on_exit)
411 self.exit_now = (not self.keepkernel_on_exit)
General Comments 0
You need to be logged in to leave comments. Login now