[Python-mode] [ python-mode-Bugs-1180180 ] Proposed improvement for pycomplete

SourceForge.net noreply at sourceforge.net
Sun Feb 26 17:18:57 CET 2006

Bugs item #1180180, was opened at 2005-04-10 20:33
Message generated for change (Comment added) made by liujin
You can respond by visiting: 

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Hugo Haas (hugoh)
Assigned to: Nobody/Anonymous (nobody)
Summary: Proposed improvement for pycomplete

Initial Comment:

I really like the idea of pycomplete a lot.

However, it only completes simple cases: "sys.cl"
becomes "sys.clock" once completed.

What would be interesting would be to get a list of
completions for "sys.".

I believe that what needs to be changed is the following:
- have pycomplete.py return a list of all possibilities
- in py-complete() in pycomplete.el, use the output of
pycomplete.py to call try-completion; if it works, use
it, if not and there are several possibilities, display
all the possibilities given by all-completions and
allow to chose between them.

The former is trivial (patch attached).

I tried to do the latter, but my lack of knowledge in
elisp put a rapid stop to it, so in case somebody knows
elisp and is interested by this (I think it would be a
cool feature), I thought I'd record the idea here.




Comment By: Liu Jin (liujin)
Date: 2006-02-27 00:18

Logged In: YES 

Unable to see errebepe's patch, but here's my attempt 
following IPython's implemention.  It's like other 
completions in Emacs:
- No completion: ring bell and display in echo area "Can't 
find completion for 'foo'"
- Sole completion: complete
- Multiple completion: open a window with mouse-clickable 

--- pycomplete.py.old	Wed Jan 11 21:07:19 2006
+++ pycomplete.py	Sun Feb 26 23:49:19 2006
@@ -74,12 +74,21 @@
 def pycomplete(s, imports=None):
     completions = get_all_completions(s, imports)
+    if len(completions) == 0:
+        return None
     dots = s.split(".")
-    return os.path.commonprefix([k[len(dots[-1]):] for k 
in completions])
+    prefix = os.path.commonprefix([k for k in completions])
+    if len(completions)==1 or len(prefix)>len(dots[-1]):
+        return [prefix[len(dots[-1]):]]
+    return completions

--- pycomplete.el.old	Sat Dec  3 00:30:11 2005
+++ pycomplete.el	Sun Feb 26 23:51:16 2006
@@ -10,9 +10,21 @@
 (defun py-complete ()
-  (let ((pymacs-forget-mutability t)) 
-    (insert (pycomplete-pycomplete (py-symbol-near-point)
-				   (py-find-global-
+  (let* ((pymacs-forget-mutability t)
+         (symbol (py-symbol-near-point))
+         (completions
+          (pycomplete-pycomplete symbol
+                                 (py-find-global-
+    (cond ((null completions)           ; no matching 
+           (message "Can't find completion for \"%s\"" 
+           (ding))
+          ((null (cdr completions)) ; sole completion
+           (insert (car completions)))
+          (t
+           (message "Making completion list...")
+           (with-output-to-temp-buffer "*Python 
+             (display-completion-list completions))
+           (message "Making completion list...%
s" "done")))))
 (defun py-find-global-imports ()


Comment By: Rodrigo Bernardo Pimentel (errebepe)
Date: 2005-06-28 11:26

Logged In: YES 

Ahn... Sorry, false alarm. I was still using my code
completion code and hadn't realized it. No wonder it was so
similar ;)

Haven't had much luck using Semantic yet, though I still
think it's the best approach.


Comment By: Rodrigo Bernardo Pimentel (errebepe)
Date: 2005-06-28 05:44

Logged In: YES 

I just managed to use Semantic with ECB
(http://ecb.sourceforge.net/). Installed both, fired up ECB
(M-x ecb-activate). From then on, on a source file, I type
M-Tab and it completes (using the same "interface" my patch
provides, which I found cool, BTW). I've spotted what is
apparently a bug (when importing a module from a file I
created on the current directory), but otherwise it seems to


Comment By: Rodrigo Bernardo Pimentel (errebepe)
Date: 2005-06-28 04:13

Logged In: YES 

I used minibuffer because it seems to be the way Emacs
usually handles these things. It's also a close analogy with
the way Eclipse does it.

Anyway, I've been thinking about code-completion for a
while, and it seems the best way to do it would be to parse
the code and act according to context. Apparently, the
Semantic package
(http://cedet.sourceforge.net/semantic.shtml) does this.
Now, if I can get it to work...


Comment By: Hugo Haas (hugoh)
Date: 2005-06-27 06:37

Logged In: YES 

It seems to do exactly what I was after! Except maybe for
the completion prompt, as maybe it could just give a list of
possibilities in a separate buffer without requiring the use
of the mini-buffer, but that's a detail.

Thanks a lot.


Comment By: Rodrigo Bernardo Pimentel (errebepe)
Date: 2005-05-27 08:52

Logged In: YES 

I've implemented these suggestions and put the resulting
files at http://isnomore.net/prog/pycomplete/ . Please take
a look and let me know what you (all) think.


You can respond by visiting: 

More information about the Python-mode mailing list