annotate etc/emacs3.py @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 1489c9287d53
children 376148b31b5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 100972
diff changeset
1 # Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
2 # Author: Dave Love <fx@gnu.org>
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
3
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
4 # This file is part of GNU Emacs.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
5
95004
cbf5528cf447 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87664
diff changeset
6 # GNU Emacs is free software: you can redistribute it and/or modify
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
7 # it under the terms of the GNU General Public License as published by
95004
cbf5528cf447 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87664
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
cbf5528cf447 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87664
diff changeset
9 # (at your option) any later version.
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
10
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
11 # GNU Emacs is distributed in the hope that it will be useful,
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
14 # GNU General Public License for more details.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
15
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
16 # You should have received a copy of the GNU General Public License
95004
cbf5528cf447 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87664
diff changeset
17 # along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
18
110114
1489c9287d53 * emacs3.py: Import imp module and use it (Bug#5756).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
19 import os, sys, traceback, inspect, imp, __main__
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
20
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
21 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
22 set
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
23 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
24 from sets import Set as set
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
25
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
26 __all__ = ["eexecfile", "eargs", "complete", "ehelp", "eimport", "modpath"]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
27
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
28 def format_exception (filename, should_remove_self):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
29 type, value, tb = sys.exc_info ()
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
30 sys.last_type = type
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
31 sys.last_value = value
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
32 sys.last_traceback = tb
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
33 if type is SyntaxError:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
34 try: # parse the error message
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
35 msg, (dummy_filename, lineno, offset, line) = value
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
36 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
37 pass # Not the format we expect; leave it alone
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
38 else:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
39 # Stuff in the right filename
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
40 value = SyntaxError(msg, (filename, lineno, offset, line))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
41 sys.last_value = value
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
42 res = traceback.format_exception_only (type, value)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
43 # There are some compilation errors which do not provide traceback so we
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
44 # should not massage it.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
45 if should_remove_self:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
46 tblist = traceback.extract_tb (tb)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
47 del tblist[:1]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
48 res = traceback.format_list (tblist)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
49 if res:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
50 res.insert(0, "Traceback (most recent call last):\n")
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
51 res[len(res):] = traceback.format_exception_only (type, value)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
52 # traceback.print_exception(type, value, tb)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
53 for line in res: print(line, end=' ')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
54
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
55 def eexecfile (file):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
56 """Execute FILE and then remove it.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
57 Execute the file within the __main__ namespace.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
58 If we get an exception, print a traceback with the top frame
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
59 (ourselves) excluded."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
60 # We cannot use real execfile since it has a bug where the file stays
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
61 # locked forever (under w32) if SyntaxError occurs.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
62 # --- code based on code.py and PyShell.py.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
63 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
64 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
65 source = open (file, "r").read()
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
66 code = compile (source, file, "exec")
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
67 # Other exceptions (shouldn't be any...) will (correctly) fall
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
68 # through to "final".
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
69 except (OverflowError, SyntaxError, ValueError):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
70 # FIXME: When can compile() raise anything else than
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
71 # SyntaxError ????
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
72 format_exception (file, False)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
73 return
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
74 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
75 exec(code, __main__.__dict__)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
76 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
77 format_exception (file, True)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
78 finally:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
79 os.remove (file)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
80
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
81 def eargs (name, imports):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
82 "Get arglist of NAME for Eldoc &c."
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
83 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
84 if imports: exec(imports)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
85 parts = name.split ('.')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
86 if len (parts) > 1:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
87 exec('import ' + parts[0]) # might fail
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
88 func = eval (name)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
89 if inspect.isbuiltin (func) or type(func) is type:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
90 doc = func.__doc__
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
91 if doc.find (' ->') != -1:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
92 print('_emacs_out', doc.split (' ->')[0])
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
93 else:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
94 print('_emacs_out', doc.split ('\n')[0])
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
95 return
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
96 if inspect.ismethod (func):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
97 func = func.im_func
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
98 if not inspect.isfunction (func):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
99 print('_emacs_out ')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
100 return
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
101 (args, varargs, varkw, defaults) = inspect.getargspec (func)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
102 # No space between name and arglist for consistency with builtins.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
103 print('_emacs_out', \
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
104 func.__name__ + inspect.formatargspec (args, varargs, varkw,
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
105 defaults))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
106 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
107 print("_emacs_out ")
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
108
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
109 def all_names (object):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
110 """Return (an approximation to) a list of all possible attribute
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
111 names reachable via the attributes of OBJECT, i.e. roughly the
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
112 leaves of the dictionary tree under it."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
113
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
114 def do_object (object, names):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
115 if inspect.ismodule (object):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
116 do_module (object, names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
117 elif inspect.isclass (object):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
118 do_class (object, names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
119 # Might have an object without its class in scope.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
120 elif hasattr (object, '__class__'):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
121 names.add ('__class__')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
122 do_class (object.__class__, names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
123 # Probably not a good idea to try to enumerate arbitrary
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
124 # dictionaries...
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
125 return names
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
126
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
127 def do_module (module, names):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
128 if hasattr (module, '__all__'): # limited export list
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
129 names.update(module.__all__)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
130 for i in module.__all__:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
131 do_object (getattr (module, i), names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
132 else: # use all names
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
133 names.update(dir (module))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
134 for i in dir (module):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
135 do_object (getattr (module, i), names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
136 return names
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
137
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
138 def do_class (object, names):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
139 ns = dir (object)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
140 names.update(ns)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
141 if hasattr (object, '__bases__'): # superclasses
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
142 for i in object.__bases__: do_object (i, names)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
143 return names
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
144
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
145 return do_object (object, set([]))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
146
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
147 def complete (name, imports):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
148 """Complete TEXT in NAMESPACE and print a Lisp list of completions.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
149 Exec IMPORTS first."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
150 import __main__, keyword
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
151
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
152 def class_members(object):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
153 names = dir (object)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
154 if hasattr (object, '__bases__'):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
155 for super in object.__bases__:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
156 names = class_members (super)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
157 return names
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
158
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
159 names = set([])
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
160 base = None
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
161 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
162 dict = __main__.__dict__.copy()
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
163 if imports: exec(imports, dict)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
164 l = len (name)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
165 if not "." in name:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
166 for src in [dir (__builtins__), keyword.kwlist, list(dict.keys())]:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
167 for elt in src:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
168 if elt[:l] == name: names.add(elt)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
169 else:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
170 base = name[:name.rfind ('.')]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
171 name = name[name.rfind('.')+1:]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
172 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
173 object = eval (base, dict)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
174 names = set(dir (object))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
175 if hasattr (object, '__class__'):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
176 names.add('__class__')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
177 names.update(class_members (object))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
178 except: names = all_names (dict)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
179 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
180 print(sys.exc_info())
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
181 names = []
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
182
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
183 l = len(name)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
184 print('_emacs_out (', end=' ')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
185 for n in names:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
186 if name == n[:l]:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
187 if base: print('"%s.%s"' % (base, n), end=' ')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
188 else: print('"%s"' % n, end=' ')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
189 print(')')
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
190
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
191 def ehelp (name, imports):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
192 """Get help on string NAME.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
193 First try to eval name for, e.g. user definitions where we need
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
194 the object. Otherwise try the string form."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
195 locls = {}
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
196 if imports:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
197 try: exec(imports, locls)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
198 except: pass
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
199 try: help (eval (name, globals(), locls))
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
200 except: help (name)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
201
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
202 def eimport (mod, dir):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
203 """Import module MOD with directory DIR at the head of the search path.
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
204 NB doesn't load from DIR if MOD shadows a system module."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
205 from __main__ import __dict__
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
206
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
207 path0 = sys.path[0]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
208 sys.path[0] = dir
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
209 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
210 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
211 if mod in __dict__ and inspect.ismodule (__dict__[mod]):
110114
1489c9287d53 * emacs3.py: Import imp module and use it (Bug#5756).
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
212 imp.reload (__dict__[mod])
84822
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
213 else:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
214 __dict__[mod] = __import__ (mod)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
215 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
216 (type, value, tb) = sys.exc_info ()
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
217 print("Traceback (most recent call last):")
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
218 traceback.print_exception (type, value, tb.tb_next)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
219 finally:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
220 sys.path[0] = path0
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
221
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
222 def modpath (module):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
223 """Return the source file for the given MODULE (or None).
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
224 Assumes that MODULE.py and MODULE.pyc are in the same directory."""
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
225 try:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
226 path = __import__ (module).__file__
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
227 if path[-4:] == '.pyc' and os.path.exists (path[0:-1]):
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
228 path = path[:-1]
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
229 print("_emacs_out", path)
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
230 except:
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
231 print("_emacs_out ()")
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
232
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
233 # print '_emacs_ok' # ready for input and can call continuation
82a29542ff1d Adam Hupp <adam at hupp.org>
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
234
84885
69c173eabff4 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 84822
diff changeset
235 # arch-tag: 37bfed38-5f4a-4027-a2bf-d5f41819dd89