gnus-html-rescale-image: Use window-inside-pixel-edges rather than window-pixel-edges
[gnus] / lisp / gnus-group.el
1 ;;; gnus-group.el --- group mode commands for Gnus
2
3 ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 ;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
6 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
7 ;; Keywords: news
8
9 ;; This file is part of GNU Emacs.
10
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation, either version 3 of the License, or
14 ;; (at your option) any later version.
15
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;; GNU General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
23
24 ;;; Commentary:
25
26 ;;; Code:
27
28 ;; For Emacs < 22.2.
29 (eval-and-compile
30   (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
31
32 (eval-when-compile
33   (require 'cl))
34 (defvar tool-bar-mode)
35
36 (require 'gnus)
37 (require 'gnus-start)
38 (require 'nnmail)
39 (require 'gnus-spec)
40 (require 'gnus-int)
41 (require 'gnus-range)
42 (require 'gnus-win)
43 (require 'gnus-undo)
44 (require 'gmm-utils)
45 (require 'time-date)
46 (require 'gnus-ems)
47
48 (eval-when-compile
49   (require 'mm-url)
50   (let ((features (cons 'gnus-group features)))
51     (require 'gnus-sum))
52   (unless (boundp 'gnus-cache-active-hashtb)
53     (defvar gnus-cache-active-hashtb nil)))
54
55 (autoload 'gnus-agent-total-fetched-for "gnus-agent")
56 (autoload 'gnus-cache-total-fetched-for "gnus-cache")
57
58 (defcustom gnus-group-archive-directory
59   "/ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list/"
60   "*The address of the (ding) archives."
61   :group 'gnus-group-foreign
62   :type 'directory)
63
64 (defcustom gnus-group-recent-archive-directory
65   "/ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list-recent/"
66   "*The address of the most recent (ding) articles."
67   :group 'gnus-group-foreign
68   :type 'directory)
69
70 (defcustom gnus-no-groups-message "No Gnus is good news"
71   "*Message displayed by Gnus when no groups are available."
72   :group 'gnus-start
73   :type 'string)
74
75 (defcustom gnus-keep-same-level nil
76   "*Non-nil means that the next newsgroup after the current will be on the same level.
77 When you type, for instance, `n' after reading the last article in the
78 current newsgroup, you will go to the next newsgroup.  If this variable
79 is nil, the next newsgroup will be the next from the group
80 buffer.
81 If this variable is non-nil, Gnus will either put you in the
82 next newsgroup with the same level, or, if no such newsgroup is
83 available, the next newsgroup with the lowest possible level higher
84 than the current level.
85 If this variable is `best', Gnus will make the next newsgroup the one
86 with the best level."
87   :group 'gnus-group-levels
88   :type '(choice (const nil)
89                  (const best)
90                  (sexp :tag "other" t)))
91
92 (defcustom gnus-group-goto-unread t
93   "*If non-nil, movement commands will go to the next unread and subscribed group."
94   :link '(custom-manual "(gnus)Group Maneuvering")
95   :group 'gnus-group-various
96   :type 'boolean)
97
98 (defcustom gnus-goto-next-group-when-activating t
99   "*If non-nil, the \\<gnus-group-mode-map>\\[gnus-group-get-new-news-this-group] command will advance point to the next group."
100   :link '(custom-manual "(gnus)Scanning New Messages")
101   :group 'gnus-group-various
102   :type 'boolean)
103
104 (defcustom gnus-permanently-visible-groups nil
105   "*Regexp to match groups that should always be listed in the group buffer.
106 This means that they will still be listed even when there are no
107 unread articles in the groups.
108
109 If nil, no groups are permanently visible."
110   :group 'gnus-group-listing
111   :type '(choice regexp (const nil)))
112
113 (defcustom gnus-safe-html-newsgroups "\\`nnrss[+:]"
114   "Groups in which links in html articles are considered all safe.
115 The value may be a regexp matching those groups, a list of group names,
116 or nil.  This overrides `mm-w3m-safe-url-regexp' (which see).  This is
117 effective only when emacs-w3m renders html articles, i.e., in the case
118 `mm-text-html-renderer' is set to `w3m'."
119   :version "23.2"
120   :group 'gnus-group-various
121   :type '(choice regexp
122                  (repeat :tag "List of group names" (string :tag "Group"))
123                  (const nil)))
124
125 (defcustom gnus-list-groups-with-ticked-articles t
126   "*If non-nil, list groups that have only ticked articles.
127 If nil, only list groups that have unread articles."
128   :group 'gnus-group-listing
129   :type 'boolean)
130
131 (defcustom gnus-group-default-list-level gnus-level-subscribed
132   "*Default listing level.
133 Ignored if `gnus-group-use-permanent-levels' is non-nil."
134   :group 'gnus-group-listing
135   :type 'integer)
136
137 (defcustom gnus-group-list-inactive-groups t
138   "*If non-nil, inactive groups will be listed."
139   :group 'gnus-group-listing
140   :group 'gnus-group-levels
141   :type 'boolean)
142
143 (defcustom gnus-group-sort-function 'gnus-group-sort-by-alphabet
144   "*Function used for sorting the group buffer.
145 This function will be called with group info entries as the arguments
146 for the groups to be sorted.  Pre-made functions include
147 `gnus-group-sort-by-alphabet', `gnus-group-sort-by-real-name',
148 `gnus-group-sort-by-unread', `gnus-group-sort-by-level',
149 `gnus-group-sort-by-score', `gnus-group-sort-by-method',
150 `gnus-group-sort-by-server', and `gnus-group-sort-by-rank'.
151
152 This variable can also be a list of sorting functions.  In that case,
153 the most significant sort function should be the last function in the
154 list."
155   :group 'gnus-group-listing
156   :link '(custom-manual "(gnus)Sorting Groups")
157   :type '(repeat :value-to-internal (lambda (widget value)
158                                       (if (listp value) value (list value)))
159                  :match (lambda (widget value)
160                           (or (symbolp value)
161                               (widget-editable-list-match widget value)))
162                  (choice (function-item gnus-group-sort-by-alphabet)
163                          (function-item gnus-group-sort-by-real-name)
164                          (function-item gnus-group-sort-by-unread)
165                          (function-item gnus-group-sort-by-level)
166                          (function-item gnus-group-sort-by-score)
167                          (function-item gnus-group-sort-by-method)
168                          (function-item gnus-group-sort-by-server)
169                          (function-item gnus-group-sort-by-rank)
170                          (function :tag "other" nil))))
171
172 (defcustom gnus-group-line-format "%M\%S\%p\%P\%5y:%B%(%g%)\n"
173   "*Format of group lines.
174 It works along the same lines as a normal formatting string,
175 with some simple extensions.
176
177 %M    Only marked articles (character, \"*\" or \" \")
178 %S    Whether the group is subscribed (character, \"U\", \"K\", \"Z\" or \" \")
179 %L    Level of subscribedness (integer)
180 %N    Number of unread articles (integer)
181 %I    Number of dormant articles (integer)
182 %i    Number of ticked and dormant (integer)
183 %T    Number of ticked articles (integer)
184 %R    Number of read articles (integer)
185 %U    Number of unseen articles (integer)
186 %t    Estimated total number of articles (integer)
187 %y    Number of unread, unticked articles (integer)
188 %G    Group name (string)
189 %g    Qualified group name (string)
190 %c    Short (collapsed) group name.  See `gnus-group-uncollapsed-levels'.
191 %C    Group comment (string)
192 %D    Group description (string)
193 %s    Select method (string)
194 %o    Moderated group (char, \"m\")
195 %p    Process mark (char)
196 %B    Whether a summary buffer for the group is open (char, \"*\")
197 %O    Moderated group (string, \"(m)\" or \"\")
198 %P    Topic indentation (string)
199 %m    Whether there is new(ish) mail in the group (char, \"%\")
200 %n    Select from where (string)
201 %z    A string that look like `<%s:%n>' if a foreign select method is used
202 %d    The date the group was last entered.
203 %E    Icon as defined by `gnus-group-icon-list'.
204 %F    The disk space used by the articles fetched by both the cache and agent.
205 %u    User defined specifier.  The next character in the format string should
206