rlineimpl.py
74 lines
| 2.7 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 | |||
MinRK
|
r15403 | _rlmod_names = ['gnureadline', 'readline'] | ||
have_readline = False | ||||
for _rlmod_name in _rlmod_names: | ||||
MinRK
|
r5206 | try: | ||
MinRK
|
r15403 | # import readline as _rl | ||
_rl = __import__(_rlmod_name) | ||||
# from readline import * | ||||
globals().update({k:v for k,v in _rl.__dict__.items() if not k.startswith('_')}) | ||||
except ImportError: | ||||
pass | ||||
MinRK
|
r5206 | else: | ||
vivainio
|
r671 | have_readline = True | ||
MinRK
|
r15403 | break | ||
MinRK
|
r5206 | |||
cgohlke
|
r15763 | if have_readline and (sys.platform == 'win32' or sys.platform == 'cli'): | ||
vivainio
|
r503 | try: | ||
fperez
|
r644 | _outputfile=_rl.GetOutputFile() | ||
vivainio
|
r671 | except AttributeError: | ||
MinRK
|
r3938 | warnings.warn("Failed GetOutputFile") | ||
fperez
|
r644 | have_readline = False | ||
bgranger
|
r884 | |||
# Test to see if libedit is being used instead of GNU readline. | ||||
MinRK
|
r3906 | # Thanks to Boyd Waters for the original patch. | ||
bgranger
|
r884 | uses_libedit = False | ||
MinRK
|
r5209 | |||
MinRK
|
r5206 | if have_readline: | ||
# Official Python docs state that 'libedit' is in the docstring for libedit readline: | ||||
Christian Boos
|
r5234 | uses_libedit = _rl.__doc__ and 'libedit' in _rl.__doc__ | ||
MinRK
|
r5206 | # Note that many non-System Pythons also do not use proper readline, | ||
# but do not report libedit at all, nor are they linked dynamically against libedit. | ||||
# known culprits of this include: EPD, Fink | ||||
# There is not much we can do to detect this, until we find a specific failure | ||||
# case, rather than relying on the readline module to self-identify as broken. | ||||
MinRK
|
r5209 | |||
MinRK
|
r5206 | if uses_libedit and sys.platform == 'darwin': | ||
_rl.parse_and_bind("bind ^I rl_complete") | ||||
warnings.warn('\n'.join(['', "*"*78, | ||||
"libedit detected - readline will not be well behaved, including but not limited to:", | ||||
" * crashes on tab completion", | ||||
" * incorrect history navigation", | ||||
" * corrupting long-lines", | ||||
" * failure to wrap or indent lines properly", | ||||
MinRK
|
r15403 | "It is highly recommended that you install gnureadline, which is installable with:", | ||
" pip install gnureadline", | ||||
MinRK
|
r5206 | "*"*78]), | ||
RuntimeWarning) | ||||
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 | ||