]> git.eshelyaron.com Git - emacs.git/commitdiff
python.el: Do not break IPython magic completions.
authorFabián Ezequiel Gallina <fgallina@gnu.org>
Mon, 6 Apr 2015 22:18:46 +0000 (19:18 -0300)
committerFabián Ezequiel Gallina <fgallina@gnu.org>
Mon, 6 Apr 2015 22:18:46 +0000 (19:18 -0300)
Fixes: debbugs:19736
* lisp/progmodes/python.el (python-shell-completion-setup-code):
Cleaner setup; import rlcompleter as last resource.

lisp/ChangeLog
lisp/progmodes/python.el

index d2f01c34c22600b3ed458348825e05f3ba438307..70602581cba6892e258c2b027187e2290354aceb 100644 (file)
@@ -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.
index 50b9d1b0eeee0a2beded72a9b61a08f18c871c66..c89241bbaa071dde866c10b61911068f700d3a81 100644 (file)
@@ -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"