GNU bug report logs - #68559
[PATCH] Improve Python shell completion

Previous Next

Package: emacs;

Reported by: Liu Hui <liuhui1610 <at> gmail.com>

Date: Thu, 18 Jan 2024 04:50:01 UTC

Severity: wishlist

Tags: patch

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Liu Hui <liuhui1610 <at> gmail.com>
To: kobarity <kobarity <at> gmail.com>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 68559 <at> debbugs.gnu.org
Subject: bug#68559: [PATCH] Improve Python shell completion
Date: Mon, 5 Feb 2024 23:03:19 +0800
[Message part 1 (text/plain, inline)]
On Sun, Feb 4, 2024 at 10:35 PM kobarity <kobarity <at> gmail.com> wrote:

> > It is more a limitation of readline completer than a problem with
> > jedi, as we cannot provide proper completion context for jedi. We may
> > define a custom completer to combine jedi and rlcompleter, e.g.
> >
> > (setq python-shell-readline-completer "
> > def __PYTHON_EL_setup_readline_completer():
> >     import readline, rlcompleter
> >     import re, sys, os, __main__
> >     from jedi import Interpreter
> >
> >     class MyJediRL:
> >         def __init__(self):
> >             self.rlcompleter = rlcompleter.Completer()
> >             self.rldelim = readline.get_completer_delims()
> >
> >         def complete(self, text, state):
> >             if state == 0:
> >                 sys.path.insert(0, os.getcwd())
> >                 try:
> >                     interpreter = Interpreter(text, [__main__.__dict__])
> >                     completions = interpreter.complete(fuzzy=False)
> >                     self.matches = [
> >                         text[:len(text) - c._like_name_length] + c.name_with_symbols
> >                         for c in completions
> >                     ]
> >
> >                     # try rlcompleter
> >                     sub = re.split('[' + re.escape(self.rldelim) + ']', text)[-1]
> >                     i = 0
> >                     while True:
> >                         completion = self.rlcompleter.complete(sub, i)
> >                         if not completion:
> >                             break
> >                         i += 1
> >                         completion = text[:len(text)-len(sub)] + completion.rstrip(' ()')
> >                         if completion not in self.matches:
> >                             self.matches.append(completion)
> >                 except:
> >                     raise
> >                 finally:
> >                     sys.path.pop(0)
> >             try:
> >                 return self.matches[state]
> >             except IndexError:
> >                 return None
> >
> >     readline.set_completer(MyJediRL().complete)
> >     readline.set_completer_delims('')")
>
> Thank you for the detailed explanation and the workaround.  I
> confirmed that the problem is solved by the above workaround.  Just to
> confirm, are you of the opinion that this workaround should not be the
> default?

I'm not sure if we should add more Python code in the form of strings
to python.el, which increases maintenance burden IMO. Maybe they could
be distributed separately at ELPA/Git forges.

Actually, I'm considering simplifying this patch to mainly fix the bug
that python shell completion doesn't respect the delimiter of readline
completer. The new patch has been attached. It should support
the completer defined in the PYTHONSTARTUP file, e.g., jedi or a
custom completer like the above one. WDYT?
[0001-Respect-the-delimiter-of-completer-in-Python-shell-c.patch (text/x-patch, attachment)]

This bug report was last modified 1 year and 66 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.