diff options
author | Fabián Ezequiel Gallina <fgallina@gnu.org> | 2015-04-06 19:18:46 -0300 |
---|---|---|
committer | Fabián Ezequiel Gallina <fgallina@gnu.org> | 2015-04-06 19:18:46 -0300 |
commit | ab9252a01a61d08cc866dfc73dbed95523523556 (patch) | |
tree | c5e50df3b9c1762d4700ab782ad19e0bea12c273 | |
parent | c91fd97dfb54863365e7153d0ccde144c79bb54f (diff) | |
download | emacs-ab9252a01a61d08cc866dfc73dbed95523523556.tar.gz |
python.el: Do not break IPython magic completions.
Fixes: debbugs:19736
* lisp/progmodes/python.el (python-shell-completion-setup-code):
Cleaner setup; import rlcompleter as last resource.
-rw-r--r-- | lisp/ChangeLog | 7 | ||||
-rw-r--r-- | lisp/progmodes/python.el | 35 |
2 files changed, 28 insertions, 14 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d2f01c34c22..70602581cba 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2015-04-06 Fabián Ezequiel Gallina <fgallina@gnu.org> + + python.el: Do not break IPython magic completions. (Bug#19736) + + * progmodes/python.el (python-shell-completion-setup-code): + Cleaner setup; import rlcompleter as last resource. + 2015-04-06 Artur Malabarba <bruce.connor.am@gmail.com> * emacs-lisp/package.el: Fix lack of "new" packages. diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 50b9d1b0eee..c89241bbaa0 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2962,25 +2962,25 @@ This function takes the list of setup code to send from the (defcustom python-shell-completion-setup-code "try: - import __builtin__ -except ImportError: - # Python 3 - import builtins as __builtin__ -try: - import readline, rlcompleter + import readline except: def __PYTHON_EL_get_completions(text): return [] else: def __PYTHON_EL_get_completions(text): + try: + import __builtin__ + except ImportError: + # Python 3 + import builtins as __builtin__ builtins = dir(__builtin__) completions = [] + is_ipython = ('__IPYTHON__' in builtins or + '__IPYTHON__active' in builtins) + splits = text.split() + is_module = splits and splits[0] in ('from', 'import') try: - splits = text.split() - is_module = splits and splits[0] in ('from', 'import') - is_ipython = ('__IPYTHON__' in builtins or - '__IPYTHON__active' in builtins) - if is_module: + if is_ipython and is_module: from IPython.core.completerlib import module_completion completions = module_completion(text.strip()) elif is_ipython and '__IP' in builtins: @@ -2988,13 +2988,20 @@ else: elif is_ipython and 'get_ipython' in builtins: completions = get_ipython().Completer.all_completions(text) else: + # Try to reuse current completer. + completer = readline.get_completer() + if not completer: + # importing rlcompleter sets the completer, use it as a + # last resort to avoid breaking customizations. + import rlcompleter + completer = readline.get_completer() i = 0 while True: - res = readline.get_completer()(text, i) - if not res: + completion = completer(text, i) + if not completion: break i += 1 - completions.append(res) + completions.append(completion) except: pass return completions" |