##// END OF EJS Templates
Multiple improvements to tab completion....
Multiple improvements to tab completion. I refactored the API quite a bit, to retain readline compatibility but make it more independent of readline. There's still more to do in cleaning up our init_readline() method, but now the completer objects have separate rlcomplete() and complete() methods. The former uses the quirky readline API with a state flag, while the latter is stateless, takes only text information, and is more suitable for GUIs and other frontends to call programatically. Made other minor fixes to ensure the test suite passes in full. While all this code is a bit messy, we're getting in the direction of the APIs we need in the long run.

File last commit:

r1234:52b55407
r2839:8cff4913
Show More
display_trap.py
100 lines | 3.1 KiB | text/x-python | PythonLexer
# encoding: utf-8
"""Manager for replacing sys.displayhook()."""
__docformat__ = "restructuredtext en"
#-------------------------------------------------------------------------------
# Copyright (C) 2008 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
#-------------------------------------------------------------------------------
# Standard library imports.
import sys
class DisplayTrap(object):
""" Object to trap and format objects passing through sys.displayhook().
This trap maintains two lists of callables: formatters and callbacks. The
formatters take the *last* object that has gone through since the trap was
set and returns a string representation. Callbacks are executed on *every*
object that passes through the displayhook and does not return anything.
"""
def __init__(self, formatters=None, callbacks=None):
# A list of formatters to apply. Each should be an instance conforming
# to the IDisplayFormatter interface.
if formatters is None:
formatters = []
self.formatters = formatters
# A list of callables, each of which should be executed *every* time an
# object passes through sys.displayhook().
if callbacks is None:
callbacks = []
self.callbacks = callbacks
# The last object to pass through the displayhook.
self.obj = None
# The previous hook before we replace it.
self.old_hook = None
def hook(self, obj):
""" This method actually implements the hook.
"""
# Run through the list of callbacks and trigger all of them.
for callback in self.callbacks:
callback(obj)
# Store the object for formatting.
self.obj = obj
def set(self):
""" Set the hook.
"""
if sys.displayhook is not self.hook:
self.old_hook = sys.displayhook
sys.displayhook = self.hook
def unset(self):
""" Unset the hook.
"""
sys.displayhook = self.old_hook
def clear(self):
""" Reset the stored object.
"""
self.obj = None
def add_to_message(self, message):
""" Add the formatted display of the objects to the message dictionary
being returned from the interpreter to its listeners.
"""
# If there was no displayed object (or simply None), then don't add
# anything.
if self.obj is None:
return
# Go through the list of formatters and let them add their formatting.
display = {}
for formatter in self.formatters:
representation = formatter(self.obj)
if representation is not None:
display[formatter.identifier] = representation
message['display'] = display