rlineimpl.py
86 lines
| 2.9 KiB
| text/x-python
|
PythonLexer
vivainio
|
r503 | # -*- coding: utf-8 -*- | ||
fperez
|
r644 | """ Imports and provides the 'correct' version of readline for the platform. | ||
vivainio
|
r503 | |||
Brian Granger
|
r2498 | Readline is used throughout IPython as:: | ||
import IPython.utils.rlineimpl as readline | ||||
vivainio
|
r503 | |||
fperez
|
r644 | In addition to normal readline stuff, this module provides have_readline | ||
Brian Granger
|
r2498 | boolean and _outputfile variable used in IPython.utils. | ||
Fernando Perez
|
r1853 | """ | ||
vivainio
|
r503 | |||
import sys | ||||
MinRK
|
r3475 | import warnings | ||
vivainio
|
r503 | |||
fperez
|
r644 | try: | ||
from readline import * | ||||
import readline as _rl | ||||
have_readline = True | ||||
except ImportError: | ||||
vivainio
|
r671 | try: | ||
from pyreadline import * | ||||
import pyreadline as _rl | ||||
have_readline = True | ||||
MinRK
|
r3538 | except ImportError: | ||
vivainio
|
r671 | have_readline = False | ||
vivainio
|
r503 | |||
MinRK
|
r3538 | if have_readline and hasattr(_rl, 'rlmain'): | ||
# patch add_history to allow for strings in pyreadline <= 1.5: | ||||
# fix copied from pyreadline 1.6 | ||||
import pyreadline | ||||
if pyreadline.release.version <= '1.5': | ||||
def add_history(line): | ||||
"""add a line to the history buffer.""" | ||||
from pyreadline import lineobj | ||||
if not isinstance(line, lineobj.TextLine): | ||||
line = lineobj.TextLine(line) | ||||
return _rl.add_history(line) | ||||
fperez
|
r644 | if sys.platform == 'win32' and have_readline: | ||
vivainio
|
r503 | try: | ||
fperez
|
r644 | _outputfile=_rl.GetOutputFile() | ||
vivainio
|
r671 | except AttributeError: | ||
fperez
|
r644 | print "Failed GetOutputFile" | ||
have_readline = False | ||||
bgranger
|
r884 | |||
# Test to see if libedit is being used instead of GNU readline. | ||||
# Thanks to Boyd Waters for this patch. | ||||
uses_libedit = False | ||||
if sys.platform == 'darwin' and have_readline: | ||||
bgranger
|
r890 | import commands | ||
Fernando Perez
|
r2556 | # Boyd's patch had a 'while True' here, I'm always a little worried about | ||
# infinite loops with such code, so for now I'm taking a more conservative | ||||
# approach. See https://bugs.launchpad.net/ipython/+bug/411599. | ||||
for i in range(10): | ||||
try: | ||||
(status, result) = commands.getstatusoutput( "otool -L %s | grep libedit" % _rl.__file__ ) | ||||
break | ||||
except IOError, (errno, strerror): | ||||
if errno == 4: | ||||
continue | ||||
Fernando Perez
|
r2560 | else: | ||
Fernando Perez
|
r2556 | break | ||
bgranger
|
r890 | if status == 0 and len(result) > 0: | ||
# we are bound to libedit - new in Leopard | ||||
_rl.parse_and_bind("bind ^I rl_complete") | ||||
MinRK
|
r3475 | warnings.warn("Leopard libedit detected - readline will not be well behaved " | ||
"including some crashes on tab completion, and incorrect history navigation. " | ||||
"It is highly recommended that you install readline, " | ||||
"which is easy_installable with: 'easy_install readline'", | ||||
RuntimeWarning) | ||||
bgranger
|
r890 | uses_libedit = True | ||
bgranger
|
r884 | |||
fperez
|
r644 | # the clear_history() function was only introduced in Python 2.4 and is | ||
# actually optional in the readline API, so we must explicitly check for its | ||||
# existence. Some known platforms actually don't have it. This thread: | ||||
# http://mail.python.org/pipermail/python-dev/2003-August/037845.html | ||||
# has the original discussion. | ||||
if have_readline: | ||||
vivainio
|
r503 | try: | ||
vivainio
|
r671 | _rl.clear_history | ||
fperez
|
r644 | except AttributeError: | ||
def clear_history(): pass | ||||
Fernando Perez
|
r1853 | _rl.clear_history = clear_history | ||