Mercurial > emacs
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 |
rev | line source |
---|---|
106815 | 1 # Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
84822 | 2 # Author: Dave Love <fx@gnu.org> |
3 | |
4 # This file is part of GNU Emacs. | |
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 | 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 | 10 |
11 # GNU Emacs is distributed in the hope that it will be useful, | |
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 # GNU General Public License for more details. | |
15 | |
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 | 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 | 20 |
21 try: | |
22 set | |
23 except: | |
24 from sets import Set as set | |
25 | |
26 __all__ = ["eexecfile", "eargs", "complete", "ehelp", "eimport", "modpath"] | |
27 | |
28 def format_exception (filename, should_remove_self): | |
29 type, value, tb = sys.exc_info () | |
30 sys.last_type = type | |
31 sys.last_value = value | |
32 sys.last_traceback = tb | |
33 if type is SyntaxError: | |
34 try: # parse the error message | |
35 msg, (dummy_filename, lineno, offset, line) = value | |
36 except: | |
37 pass # Not the format we expect; leave it alone | |
38 else: | |
39 # Stuff in the right filename | |
40 value = SyntaxError(msg, (filename, lineno, offset, line)) | |
41 sys.last_value = value | |
42 res = traceback.format_exception_only (type, value) | |
43 # There are some compilation errors which do not provide traceback so we | |
44 # should not massage it. | |
45 if should_remove_self: | |
46 tblist = traceback.extract_tb (tb) | |
47 del tblist[:1] | |
48 res = traceback.format_list (tblist) | |
49 if res: | |
50 res.insert(0, "Traceback (most recent call last):\n") | |
51 res[len(res):] = traceback.format_exception_only (type, value) | |
52 # traceback.print_exception(type, value, tb) | |
53 for line in res: print(line, end=' ') | |
54 | |
55 def eexecfile (file): | |
56 """Execute FILE and then remove it. | |
57 Execute the file within the __main__ namespace. | |
58 If we get an exception, print a traceback with the top frame | |
59 (ourselves) excluded.""" | |
60 # We cannot use real execfile since it has a bug where the file stays | |
61 # locked forever (under w32) if SyntaxError occurs. | |
62 # --- code based on code.py and PyShell.py. | |
63 try: | |
64 try: | |
65 source = open (file, "r").read() | |
66 code = compile (source, file, "exec") | |
67 # Other exceptions (shouldn't be any...) will (correctly) fall | |
68 # through to "final". | |
69 except (OverflowError, SyntaxError, ValueError): | |
70 # FIXME: When can compile() raise anything else than | |
71 # SyntaxError ???? | |
72 format_exception (file, False) | |
73 return | |
74 try: | |
75 exec(code, __main__.__dict__) | |
76 except: | |
77 format_exception (file, True) | |
78 finally: | |
79 os.remove (file) | |
80 | |
81 def eargs (name, imports): | |
82 "Get arglist of NAME for Eldoc &c." | |
83 try: | |
84 if imports: exec(imports) | |
85 parts = name.split ('.') | |
86 if len (parts) > 1: | |
87 exec('import ' + parts[0]) # might fail | |
88 func = eval (name) | |
89 if inspect.isbuiltin (func) or type(func) is type: | |
90 doc = func.__doc__ | |
91 if doc.find (' ->') != -1: | |
92 print('_emacs_out', doc.split (' ->')[0]) | |
93 else: | |
94 print('_emacs_out', doc.split ('\n')[0]) | |
95 return | |
96 if inspect.ismethod (func): | |
97 func = func.im_func | |
98 if not inspect.isfunction (func): | |
99 print('_emacs_out ') | |
100 return | |
101 (args, varargs, varkw, defaults) = inspect.getargspec (func) | |
102 # No space between name and arglist for consistency with builtins. | |
103 print('_emacs_out', \ | |
104 func.__name__ + inspect.formatargspec (args, varargs, varkw, | |
105 defaults)) | |
106 except: | |
107 print("_emacs_out ") | |
108 | |
109 def all_names (object): | |
110 """Return (an approximation to) a list of all possible attribute | |
111 names reachable via the attributes of OBJECT, i.e. roughly the | |
112 leaves of the dictionary tree under it.""" | |
113 | |
114 def do_object (object, names): | |
115 if inspect.ismodule (object): | |
116 do_module (object, names) | |
117 elif inspect.isclass (object): | |
118 do_class (object, names) | |
119 # Might have an object without its class in scope. | |
120 elif hasattr (object, '__class__'): | |
121 names.add ('__class__') | |
122 do_class (object.__class__, names) | |
123 # Probably not a good idea to try to enumerate arbitrary | |
124 # dictionaries... | |
125 return names | |
126 | |
127 def do_module (module, names): | |
128 if hasattr (module, '__all__'): # limited export list | |
129 names.update(module.__all__) | |
130 for i in module.__all__: | |
131 do_object (getattr (module, i), names) | |
132 else: # use all names | |
133 names.update(dir (module)) | |
134 for i in dir (module): | |
135 do_object (getattr (module, i), names) | |
136 return names | |
137 | |
138 def do_class (object, names): | |
139 ns = dir (object) | |
140 names.update(ns) | |
141 if hasattr (object, '__bases__'): # superclasses | |
142 for i in object.__bases__: do_object (i, names) | |
143 return names | |
144 | |
145 return do_object (object, set([])) | |
146 | |
147 def complete (name, imports): | |
148 """Complete TEXT in NAMESPACE and print a Lisp list of completions. | |
149 Exec IMPORTS first.""" | |
150 import __main__, keyword | |
151 | |
152 def class_members(object): | |
153 names = dir (object) | |
154 if hasattr (object, '__bases__'): | |
155 for super in object.__bases__: | |
156 names = class_members (super) | |
157 return names | |
158 | |
159 names = set([]) | |
160 base = None | |
161 try: | |
162 dict = __main__.__dict__.copy() | |
163 if imports: exec(imports, dict) | |
164 l = len (name) | |
165 if not "." in name: | |
166 for src in [dir (__builtins__), keyword.kwlist, list(dict.keys())]: | |
167 for elt in src: | |
168 if elt[:l] == name: names.add(elt) | |
169 else: | |
170 base = name[:name.rfind ('.')] | |
171 name = name[name.rfind('.')+1:] | |
172 try: | |
173 object = eval (base, dict) | |
174 names = set(dir (object)) | |
175 if hasattr (object, '__class__'): | |
176 names.add('__class__') | |
177 names.update(class_members (object)) | |
178 except: names = all_names (dict) | |
179 except: | |
180 print(sys.exc_info()) | |
181 names = [] | |
182 | |
183 l = len(name) | |
184 print('_emacs_out (', end=' ') | |
185 for n in names: | |
186 if name == n[:l]: | |
187 if base: print('"%s.%s"' % (base, n), end=' ') | |
188 else: print('"%s"' % n, end=' ') | |
189 print(')') | |
190 | |
191 def ehelp (name, imports): | |
192 """Get help on string NAME. | |
193 First try to eval name for, e.g. user definitions where we need | |
194 the object. Otherwise try the string form.""" | |
195 locls = {} | |
196 if imports: | |
197 try: exec(imports, locls) | |
198 except: pass | |
199 try: help (eval (name, globals(), locls)) | |
200 except: help (name) | |
201 | |
202 def eimport (mod, dir): | |
203 """Import module MOD with directory DIR at the head of the search path. | |
204 NB doesn't load from DIR if MOD shadows a system module.""" | |
205 from __main__ import __dict__ | |
206 | |
207 path0 = sys.path[0] | |
208 sys.path[0] = dir | |
209 try: | |
210 try: | |
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 | 213 else: |
214 __dict__[mod] = __import__ (mod) | |
215 except: | |
216 (type, value, tb) = sys.exc_info () | |
217 print("Traceback (most recent call last):") | |
218 traceback.print_exception (type, value, tb.tb_next) | |
219 finally: | |
220 sys.path[0] = path0 | |
221 | |
222 def modpath (module): | |
223 """Return the source file for the given MODULE (or None). | |
224 Assumes that MODULE.py and MODULE.pyc are in the same directory.""" | |
225 try: | |
226 path = __import__ (module).__file__ | |
227 if path[-4:] == '.pyc' and os.path.exists (path[0:-1]): | |
228 path = path[:-1] | |
229 print("_emacs_out", path) | |
230 except: | |
231 print("_emacs_out ()") | |
232 | |
233 # print '_emacs_ok' # ready for input and can call continuation | |
234 | |
84885 | 235 # arch-tag: 37bfed38-5f4a-4027-a2bf-d5f41819dd89 |