GNU bug report logs -
#19755
python.el: native completion: more problems (and solutions)
Previous Next
Reported by: Carlos Pita <carlosjosepita <at> gmail.com>
Date: Tue, 3 Feb 2015 12:41:02 UTC
Severity: normal
Tags: patch
Done: fgallina <at> gnu.org (Fabián Ezequiel Gallina)
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#19755: python.el: native completion: more problems (and solutions)
which was filed against the emacs package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 19755 <at> debbugs.gnu.org.
--
19755: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19755
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
Hola Carlos,
I pushed a fix for this at revno 911ed2e in the master branch.
I'll be slowly catching up, sorry for the long delay.
Cheers,
Fabián.
[Message part 3 (message/rfc822, inline)]
[Message part 4 (text/plain, inline)]
X-Debbugs-CC: galli.87 <at> gmail.com
Tags: patch
Hi Fabian,
besides the ones l have already reported and patched in [1] there are
some remaining problems with the native completion approach:
1) The waiting timeout is too low for import completions, as imports
take a bit more time than simple dirs. But making the timeout larger
is bad for cases when there really is no completion at all for the
current prefix. I want to avoid this trade off.
2) When all the completions share a common prefix, readline completes
inline up to this common prefix, so the delete-line-command sequence
length is wrong. For example, say the current prefix is "x" and that
its completions are "xxy", "xxz". Readline will complete "xx" inline,
but delete-line-command will only delete one "x".
3) A pager could be enabled to show long lists of completions.
My solutions for 1 and 2 simply extend the dummy completion hack I
introduced in [1]:
1') Ensure there is always one completion at least (a fortiori, I'm
ensuring there are at least two completions, to force listing instead
of inline completion). So we can set a larger timeout *just for the
first* accept-process-output without the risk of waiting too much when
there is really no completion available.
2') Ensure there is a completion with a different prefix, by providing
a dummy randomly prefixed completion.
For 3 I just disabled paged completions for readline, but I don't know
how to do that for libedit.
Attached is a patch with all the described changes, applied on top of
my patch for [1]. Anyway, it should be easy to selectively apply the
changes manually.
All in all I find the solution pretty simple and it leverages my
previous trick. The completer is a bit more complex now as it has to
keep track of a couple of states in order to generate the correct
sequence of completions (dummies included):
def completer(text, state,
real_completer=readline.get_completer(),
last_state=[None]):
completion = None
if state == 0:
last_state[0] = None
if last_state[0] is None:
completion = real_completer(text, state)
if not completion:
last_state[0] = state
if (state == last_state[0] or
state - 1 == last_state[0] == 0):
import random
completion = '%s%d__dummy_completion__' % (
text, random.randint(1000, 10000))
return completion
readline.set_completer(completer)
Cheers
--
Carlos
[1] http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19736
[native-compl.patch (text/x-patch, attachment)]
This bug report was last modified 10 years and 47 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.