Mercurial > dotfiles
diff .elisp/pycomplete.py @ 19:b5d75594b356
Add support for the ipython-mode stuff and remove vestigial pymacs code.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Mon, 08 Dec 2008 10:58:06 -0600 |
parents | |
children | 014e745b2d04 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/.elisp/pycomplete.py @@ -0,0 +1,96 @@ + +""" +Python dot expression completion using Pymacs. + +This almost certainly needs work, but if you add + + (require 'pycomplete) + +to your .xemacs/init.el file (untried w/ GNU Emacs so far) and have Pymacs +installed, when you hit M-TAB it will try to complete the dot expression +before point. For example, given this import at the top of the file: + + import time + +typing "time.cl" then hitting M-TAB should complete "time.clock". + +This is unlikely to be done the way Emacs completion ought to be done, but +it's a start. Perhaps someone with more Emacs mojo can take this stuff and +do it right. + +See pycomplete.el for the Emacs Lisp side of things. +""" + +import sys +import os.path + +try: + x = set +except NameError: + from sets import Set as set +else: + del x + +def get_all_completions(s, imports=None): + """Return contextual completion of s (string of >= zero chars). + + If given, imports is a list of import statements to be executed first. + """ + locald = {} + if imports is not None: + for stmt in imports: + try: + exec stmt in globals(), locald + except TypeError: + raise TypeError, "invalid type: %s" % stmt + + dots = s.split(".") + if not s or len(dots) == 1: + keys = set() + keys.update(locald.keys()) + keys.update(globals().keys()) + import __builtin__ + keys.update(dir(__builtin__)) + keys = list(keys) + keys.sort() + if s: + return [k for k in keys if k.startswith(s)] + else: + return keys + + sym = None + for i in range(1, len(dots)): + s = ".".join(dots[:i]) + try: + sym = eval(s, globals(), locald) + except NameError: + try: + sym = __import__(s, globals(), locald, []) + except ImportError: + return [] + if sym is not None: + s = dots[-1] + return [k for k in dir(sym) if k.startswith(s)] + +def pycomplete(s, imports=None): + completions = get_all_completions(s, imports) + dots = s.split(".") + return os.path.commonprefix([k[len(dots[-1]):] for k in completions]) + +if __name__ == "__main__": + print "<empty> ->", pycomplete("") + print "sys.get ->", pycomplete("sys.get") + print "sy ->", pycomplete("sy") + print "sy (sys in context) ->", pycomplete("sy", imports=["import sys"]) + print "foo. ->", pycomplete("foo.") + print "Enc (email * imported) ->", + print pycomplete("Enc", imports=["from email import *"]) + print "E (email * imported) ->", + print pycomplete("E", imports=["from email import *"]) + + print "Enc ->", pycomplete("Enc") + print "E ->", pycomplete("E") + +# Local Variables : +# pymacs-auto-reload : t +# End :