1 ;;; gnus-sum.el --- summary mode commands for Gnus
2 ;; Copyright (C) 1996 Free Software Foundation, Inc.
4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
7 ;; This file is part of GNU Emacs.
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
35 ;; Belongs to to gnus.el
36 (defgroup gnus-various nil
38 :link '(custom-manual "(gnus)Various Various")
41 ;; Belongs to to gnus-group.el
42 (defgroup gnus-group-select nil
44 :link '(custom-manual "(gnus)Selecting a Group")
47 ;; Belongs to to gnus-uu.el
48 (defgroup gnus-extract-view nil
49 "Viewing extracted files."
50 :link '(custom-manual "(gnus)Viewing Files")
53 ;; Belongs to article.el
54 (defgroup article-hiding-headers nil
55 "Hiding headers in the article buffer."
56 :link '(custom-manual "(gnus)Hiding Headers")
59 (defgroup article-various nil
60 "Miscellaneous article options."
61 :link '(custom-manual "(gnus)Misc Article")
64 (defgroup article-mime nil
65 "Encoding articles and including attachments."
66 :link '(custom-manual "(gnus)Using MIME")
70 (defgroup gnus-summary nil
72 :link '(custom-manual "(gnus)The Summary Buffer")
75 (defgroup gnus-summary-exit nil
76 "Leaving summary buffers."
77 :link '(custom-manual "(gnus)Exiting the Summary Buffer")
80 (defgroup gnus-summary-marks nil
81 "Marks used in summary buffers."
82 :link '(custom-manual "(gnus)Marking Articles")
85 (defgroup gnus-thread nil
86 "Ordering articles according to replies."
87 :link '(custom-manual "(gnus)Threading")
90 (defgroup gnus-summary-format nil
91 "Formatting of the summary buffer."
92 :link '(custom-manual "(gnus)Summary Buffer Format")
95 (defgroup gnus-summary-choose nil
97 :link '(custom-manual "(gnus)Choosing Articles")
100 (defgroup gnus-summary-maneuvering nil
101 "Summary movement commands."
102 :link '(custom-manual "(gnus)Summary Maneuvering")
103 :group 'gnus-summary)
105 (defgroup gnus-summary-mail nil
106 "Mail group commands."
107 :link '(custom-manual "(gnus)Mail Group Commands")
108 :group 'gnus-summary)
110 (defgroup gnus-summary-sort nil
111 "Sorting the summary buffer."
112 :link '(custom-manual "(gnus)Sorting")
113 :group 'gnus-summary)
115 (defgroup gnus-summary-visual nil
116 "Highlighting and menus in the summary buffer."
117 :link '(custom-manual "(gnus)Summary Highlighting")
119 :group 'gnus-summary)
121 (defgroup gnus-summary-various nil
122 "Various summary buffer options."
123 :link '(custom-manual "(gnus)Various Summary Stuff")
124 :group 'gnus-summary)
126 (defcustom gnus-kill-summary-on-exit t
127 "*If non-nil, kill the summary buffer when you exit from it.
128 If nil, the summary will become a \"*Dead Summary*\" buffer, and
129 it will be killed sometime later."
130 :group 'gnus-summary-exit
133 (defcustom gnus-fetch-old-headers nil
134 "*Non-nil means that Gnus will try to build threads by grabbing old headers.
135 If an unread article in the group refers to an older, already read (or
136 just marked as read) article, the old article will not normally be
137 displayed in the Summary buffer. If this variable is non-nil, Gnus
138 will attempt to grab the headers to the old articles, and thereby
139 build complete threads. If it has the value `some', only enough
140 headers to connect otherwise loose threads will be displayed.
141 This variable can also be a number. In that case, no more than that
142 number of old headers will be fetched.
144 The server has to support NOV for any of this to work."
146 :type '(choice (const :tag "off" nil)
149 (sexp :menu-tag "other" t)))
151 (defcustom gnus-summary-make-false-root 'adopt
152 "*nil means that Gnus won't gather loose threads.
153 If the root of a thread has expired or been read in a previous
154 session, the information necessary to build a complete thread has been
155 lost. Instead of having many small sub-threads from this original thread
156 scattered all over the summary buffer, Gnus can gather them.
158 If non-nil, Gnus will try to gather all loose sub-threads from an
159 original thread into one large thread.
161 If this variable is non-nil, it should be one of `none', `adopt',
164 If this variable is `none', Gnus will not make a false root, but just
165 present the sub-threads after another.
166 If this variable is `dummy', Gnus will create a dummy root that will
167 have all the sub-threads as children.
168 If this variable is `adopt', Gnus will make one of the \"children\"
169 the parent and mark all the step-children as such.
170 If this variable is `empty', the \"children\" are printed with empty
171 subject fields. (Or rather, they will be printed with a string
172 given by the `gnus-summary-same-subject' variable.)"
174 :type '(choice (const :tag "off" nil)
180 (defcustom gnus-summary-gather-exclude-subject "^ *$\\|^(none)$"
181 "*A regexp to match subjects to be excluded from loose thread gathering.
182 As loose thread gathering is done on subjects only, that means that
183 there can be many false gatherings performed. By rooting out certain
184 common subjects, gathering might become saner."
188 (defcustom gnus-summary-gather-subject-limit nil
189 "*Maximum length of subject comparisons when gathering loose threads.
190 Use nil to compare full subjects. Setting this variable to a low
191 number will help gather threads that have been corrupted by
192 newsreaders chopping off subject lines, but it might also mean that
193 unrelated articles that have subject that happen to begin with the
194 same few characters will be incorrectly gathered.
196 If this variable is `fuzzy', Gnus will use a fuzzy algorithm when
199 :type '(choice (const :tag "off" nil)
201 (sexp :menu-tag "on" t)))
203 (defcustom gnus-simplify-ignored-prefixes nil
204 "*Regexp, matches for which are removed from subject lines when simplifying fuzzily."
206 :type '(choice (const :tag "off" nil)
209 (defcustom gnus-build-sparse-threads nil
210 "*If non-nil, fill in the gaps in threads.
211 If `some', only fill in the gaps that are needed to tie loose threads
212 together. If `more', fill in all leaf nodes that Gnus can find. If
213 non-nil and non-`some', fill in all gaps that Gnus manages to guess."
215 :type '(choice (const :tag "off" nil)
218 (sexp :menu-tag "all" t)))
220 (defcustom gnus-summary-thread-gathering-function 'gnus-gather-threads-by-subject
221 "Function used for gathering loose threads.
222 There are two pre-defined functions: `gnus-gather-threads-by-subject',
223 which only takes Subjects into consideration; and
224 `gnus-gather-threads-by-references', which compared the References
225 headers of the articles to find matches."
227 :type '(set (function-item gnus-gather-threads-by-subject)
228 (function-item gnus-gather-threads-by-references)
229 (function :tag "other")))
231 ;; Added by Per Abrahamsen <amanda@iesd.auc.dk>.
232 (defcustom gnus-summary-same-subject ""
233 "*String indicating that the current article has the same subject as the previous.
234 This variable will only be used if the value of
235 `gnus-summary-make-false-root' is `empty'."
236 :group 'gnus-summary-format
239 (defcustom gnus-summary-goto-unread t
240 "*If t, marking commands will go to the next unread article.
241 If `never', commands that usually go to the next unread article, will
242 go to the next article, whether it is read or not.
243 If nil, only the marking commands will go to the next (un)read article."
244 :group 'gnus-summary-marks
245 :link '(custom-manual "(gnus)Setting Marks")
246 :type '(choice (const :tag "off" nil)
248 (sexp :menu-tag "on" t)))
250 (defcustom gnus-summary-default-score 0
251 "*Default article score level.
252 If this variable is nil, scoring will be disabled."
254 :type '(choice (const :tag "disable")
257 (defcustom gnus-summary-zcore-fuzz 0
258 "*Fuzziness factor for the zcore in the summary buffer.
259 Articles with scores closer than this to `gnus-summary-default-score'
261 :group 'gnus-summary-format
264 (defcustom gnus-simplify-subject-fuzzy-regexp ""
265 "*Strings to be removed when doing fuzzy matches.
266 This can either be a regular expression or list of regular expressions
267 that will be removed from subject strings if fuzzy subject
268 simplification is selected."
270 :type '(repeat regexp))
272 (defcustom gnus-show-threads t
273 "*If non-nil, display threads in summary mode."
277 (defcustom gnus-thread-hide-subtree nil
278 "*If non-nil, hide all threads initially.
279 If threads are hidden, you have to run the command
280 `gnus-summary-show-thread' by hand or use `gnus-select-article-hook'
281 to expose hidden threads."
285 (defcustom gnus-thread-hide-killed t
286 "*If non-nil, hide killed threads automatically."
290 (defcustom gnus-thread-ignore-subject nil
291 "*If non-nil, ignore subjects and do all threading based on the Reference header.
292 If nil, which is the default, articles that have different subjects
293 from their parents will start separate threads."
297 (defcustom gnus-thread-operation-ignore-subject t
298 "*If non-nil, subjects will be ignored when doing thread commands.
299 This affects commands like `gnus-summary-kill-thread' and
300 `gnus-summary-lower-thread'.
302 If this variable is nil, articles in the same thread with different
303 subjects will not be included in the operation in question. If this
304 variable is `fuzzy', only articles that have subjects that are fuzzily
305 equal will be included."
307 :type '(choice (const :tag "off" nil)
311 (defcustom gnus-thread-indent-level 4
312 "*Number that says how much each sub-thread should be indented."
316 (defcustom gnus-auto-extend-newsgroup t
317 "*If non-nil, extend newsgroup forward and backward when requested."
318 :group 'gnus-summary-choose
321 (defcustom gnus-auto-select-first t
322 "*If nil, don't select the first unread article when entering a group.
323 If this variable is `best', select the highest-scored unread article
324 in the group. If neither nil nor `best', select the first unread
327 If you want to prevent automatic selection of the first unread article
328 in some newsgroups, set the variable to nil in
329 `gnus-select-group-hook'."
330 :group 'gnus-group-select
331 :type '(choice (const :tag "none" nil)
333 (sexp :menu-tag "first" t)))
335 (defcustom gnus-auto-select-next t
336 "*If non-nil, offer to go to the next group from the end of the previous.
337 If the value is t and the next newsgroup is empty, Gnus will exit
338 summary mode and go back to group mode. If the value is neither nil
339 nor t, Gnus will select the following unread newsgroup. In
340 particular, if the value is the symbol `quietly', the next unread
341 newsgroup will be selected without any confirmation, and if it is
342 `almost-quietly', the next group will be selected without any
343 confirmation if you are located on the last article in the group.
344 Finally, if this variable is `slightly-quietly', the `Z n' command
345 will go to the next group without confirmation."
346 :group 'gnus-summary-maneuvering
347 :type '(choice (const :tag "off" nil)
349 (const almost-quietly)
350 (const slightly-quietly)
351 (sexp :menu-tag "on" t)))
353 (defcustom gnus-auto-select-same nil
354 "*If non-nil, select the next article with the same subject."
355 :group 'gnus-summary-maneuvering
358 (defcustom gnus-summary-check-current nil
359 "*If non-nil, consider the current article when moving.
360 The \"unread\" movement commands will stay on the same line if the
361 current article is unread."
362 :group 'gnus-summary-maneuvering
365 (defcustom gnus-auto-center-summary t
366 "*If non-nil, always center the current summary buffer.
367 In particular, if `vertical' do only vertical recentering. If non-nil
368 and non-`vertical', do both horizontal and vertical recentering."
369 :group 'gnus-summary-maneuvering
370 :type '(choice (const :tag "none" nil)
372 (sexp :menu-tag "both" t)))
374 (defcustom gnus-show-all-headers nil
375 "*If non-nil, don't hide any headers."
376 :group 'article-hiding-headers
379 (defcustom gnus-single-article-buffer t
380 "*If non-nil, display all articles in the same buffer.
381 If nil, each group will get its own article buffer."
382 :group 'article-various
385 (defcustom gnus-break-pages t
386 "*If non-nil, do page breaking on articles.
387 The page delimiter is specified by the `gnus-page-delimiter'
389 :group 'article-various
392 (defcustom gnus-show-mime nil
393 "*If non-nil, do mime processing of articles.
394 The articles will simply be fed to the function given by
395 `gnus-show-mime-method'."
399 (defcustom gnus-move-split-methods nil
400 "*Variable used to suggest where articles are to be moved to.
401 It uses the same syntax as the `gnus-split-methods' variable."
402 :group 'gnus-summary-mail
403 :type '(repeat (choice (list function)
404 (cons regexp (repeat string))
407 ;; Mark variables suggested by Thomas Michanek
408 ;; <Thomas.Michanek@telelogic.se>.
410 (defcustom gnus-unread-mark ?
411 "*Mark used for unread articles."
412 :group 'gnus-summary-marks
415 (defcustom gnus-ticked-mark ?!
416 "*Mark used for ticked articles."
417 :group 'gnus-summary-marks
420 (defcustom gnus-dormant-mark ??
421 "*Mark used for dormant articles."
422 :group 'gnus-summary-marks
425 (defcustom gnus-del-mark ?r
426 "*Mark used for del'd articles."
427 :group 'gnus-summary-marks
430 (defcustom gnus-read-mark ?R
431 "*Mark used for read articles."
432 :group 'gnus-summary-marks
435 (defcustom gnus-expirable-mark ?E
436 "*Mark used for expirable articles."
437 :group 'gnus-summary-marks
440 (defcustom gnus-killed-mark ?K
441 "*Mark used for killed articles."
442 :group 'gnus-summary-marks
445 (defcustom gnus-souped-mark ?F
446 "*Mark used for killed articles."
447 :group 'gnus-summary-marks
450 (defcustom gnus-kill-file-mark ?X
451 "*Mark used for articles killed by kill files."
452 :group 'gnus-summary-marks
455 (defcustom gnus-low-score-mark ?Y
456 "*Mark used for articles with a low score."
457 :group 'gnus-summary-marks
460 (defcustom gnus-catchup-mark ?C
461 "*Mark used for articles that are caught up."
462 :group 'gnus-summary-marks
465 (defcustom gnus-replied-mark ?A
466 "*Mark used for articles that have been replied to."
467 :group 'gnus-summary-marks
470 (defcustom gnus-cached-mark ?*
471 "*Mark used for articles that are in the cache."
472 :group 'gnus-summary-marks
475 (defcustom gnus-saved-mark ?S
476 "*Mark used for articles that have been saved to."
477 :group 'gnus-summary-marks
480 (defcustom gnus-ancient-mark ?O
481 "*Mark used for ancient articles."
482 :group 'gnus-summary-marks
485 (defcustom gnus-sparse-mark ?Q
486 "*Mark used for sparsely reffed articles."
487 :group 'gnus-summary-marks
490 (defcustom gnus-canceled-mark ?G
491 "*Mark used for canceled articles."
492 :group 'gnus-summary-marks
495 (defcustom gnus-duplicate-mark ?M
496 "*Mark used for duplicate articles."
497 :group 'gnus-summary-marks
500 (defcustom gnus-score-over-mark ?+
501 "*Score mark used for articles with high scores."
502 :group 'gnus-summary-marks
505 (defcustom gnus-score-below-mark ?-
506 "*Score mark used for articles with low scores."
507 :group 'gnus-summary-marks
510 (defcustom gnus-empty-thread-mark ?
511 "*There is no thread under the article."
512 :group 'gnus-summary-marks
515 (defcustom gnus-not-empty-thread-mark ?=
516 "*There is a thread under the article."
517 :group 'gnus-summary-marks
520 (defcustom gnus-view-pseudo-asynchronously nil
521 "*If non-nil, Gnus will view pseudo-articles asynchronously."
522 :group 'gnus-extract-view
525 (defcustom gnus-view-pseudos nil
526 "*If `automatic', pseudo-articles will be viewed automatically.
527 If `not-confirm', pseudos will be viewed automatically, and the user
528 will not be asked to confirm the command."
529 :group 'gnus-extract-view
530 :type '(choice (const :tag "off" nil)
532 (const not-confirm)))
534 (defcustom gnus-view-pseudos-separately t
535 "*If non-nil, one pseudo-article will be created for each file to be viewed.
536 If nil, all files that use the same viewing command will be given as a
537 list of parameters to that command."
538 :group 'gnus-extract-view
541 (defcustom gnus-insert-pseudo-articles t
542 "*If non-nil, insert pseudo-articles when decoding articles."
543 :group 'gnus-extract-view
546 (defcustom gnus-summary-dummy-line-format
548 "*The format specification for the dummy roots in the summary buffer.
549 It works along the same lines as a normal formatting string,
550 with some simple extensions.
553 :group 'gnus-threading
556 (defcustom gnus-summary-mode-line-format "Gnus: %%b [%A] %Z"
557 "*The format specification for the summary mode line.
558 It works along the same lines as a normal formatting string,
559 with some simple extensions:
562 %p Unprefixed group name
563 %A Current article number
565 %U Number of unread articles in the group
566 %e Number of unselected articles in the group
567 %Z A string with unread/unselected article counts
568 %g Shortish group name
569 %S Subject of the current article
571 %s Current score file name
572 %d Number of dormant articles
573 %r Number of articles that have been marked as read in this session
574 %E Number of articles expunged by the score files"
575 :group 'gnus-summary-format
578 (defcustom gnus-summary-mark-below 0
579 "*Mark all articles with a score below this variable as read.
580 This variable is local to each summary buffer and usually set by the
585 (defcustom gnus-article-sort-functions '(gnus-article-sort-by-number)
586 "*List of functions used for sorting articles in the summary buffer.
587 This variable is only used when not using a threaded display."
588 :group 'gnus-summary-sort
589 :type '(repeat (choice (function-item gnus-article-sort-by-number)
590 (function-item gnus-article-sort-by-author)
591 (function-item gnus-article-sort-by-subject)
592 (function-item gnus-article-sort-by-date)
593 (function-item gnus-article-sort-by-score)
594 (function :tag "other"))))
596 (defcustom gnus-thread-sort-functions '(gnus-thread-sort-by-number)
597 "*List of functions used for sorting threads in the summary buffer.
598 By default, threads are sorted by article number.
600 Each function takes two threads and return non-nil if the first thread
601 should be sorted before the other. If you use more than one function,
602 the primary sort function should be the last. You should probably
603 always include `gnus-thread-sort-by-number' in the list of sorting
604 functions -- preferably first.
606 Ready-made functions include `gnus-thread-sort-by-number',
607 `gnus-thread-sort-by-author', `gnus-thread-sort-by-subject',
608 `gnus-thread-sort-by-date', `gnus-thread-sort-by-score' and
609 `gnus-thread-sort-by-total-score' (see `gnus-thread-score-function')."
610 :group 'gnus-summary-sort
611 :type '(repeat (choice (function-item gnus-thread-sort-by-number)
612 (function-item gnus-thread-sort-by-author)
613 (function-item gnus-thread-sort-by-subject)
614 (function-item gnus-thread-sort-by-date)
615 (function-item gnus-thread-sort-by-score)
616 (function-item gnus-thread-sort-by-total-score)
617 (function :tag "other"))))
619 (defcustom gnus-thread-score-function '+
620 "*Function used for calculating the total score of a thread.
622 The function is called with the scores of the article and each
623 subthread and should then return the score of the thread.
625 Some functions you can use are `+', `max', or `min'."
626 :group 'gnus-summary-sort
629 (defcustom gnus-summary-expunge-below nil
630 "All articles that have a score less than this variable will be expunged."
632 :type '(choice (const :tag "off" nil)
635 (defcustom gnus-thread-expunge-below nil
636 "All threads that have a total score less than this variable will be expunged.
637 See `gnus-thread-score-function' for en explanation of what a
638 \"thread score\" is."
639 :group 'gnus-treading
641 :type '(choice (const :tag "off" nil)
644 (defcustom gnus-summary-mode-hook nil
645 "*A hook for Gnus summary mode.
646 This hook is run before any variables are set in the summary buffer."
647 :group 'gnus-summary-various
650 (defcustom gnus-summary-menu-hook nil
651 "*Hook run after the creation of the summary mode menu."
652 :group 'gnus-summary-visual
655 (defcustom gnus-summary-exit-hook nil
656 "*A hook called on exit from the summary buffer."
657 :group 'gnus-summary-exit
660 (defcustom gnus-summary-prepare-hook nil
661 "*A hook called after the summary buffer has been generated.
662 If you want to modify the summary buffer, you can use this hook."
663 :group 'gnus-summary-various
666 (defcustom gnus-summary-generate-hook nil
667 "*A hook run just before generating the summary buffer.
668 This hook is commonly used to customize threading variables and the
670 :group 'gnus-summary-various
673 (defcustom gnus-select-group-hook nil
674 "*A hook called when a newsgroup is selected.
676 If you'd like to simplify subjects like the
677 `gnus-summary-next-same-subject' command does, you can use the
680 (setq gnus-select-group-hook
683 (mapcar (lambda (header)
684 (mail-header-set-subject
686 (gnus-simplify-subject
687 (mail-header-subject header) 're-only)))
688 gnus-newsgroup-headers))))"
689 :group 'gnus-group-select
692 (defcustom gnus-select-article-hook nil
693 "*A hook called when an article is selected."
694 :group 'gnus-summary-choose
697 (defcustom gnus-visual-mark-article-hook
698 (list 'gnus-highlight-selected-summary)
699 "*Hook run after selecting an article in the summary buffer.
700 It is meant to be used for highlighting the article in some way. It
701 is not run if `gnus-visual' is nil."
702 :group 'gnus-summary-visual
705 (defcustom gnus-parse-headers-hook
706 (list 'gnus-decode-rfc1522)
707 "*A hook called before parsing the headers."
711 (defcustom gnus-exit-group-hook nil
712 "*A hook called when exiting (not quitting) summary mode."
716 (defcustom gnus-summary-update-hook
717 (list 'gnus-summary-highlight-line)
718 "*A hook called when a summary line is changed.
719 The hook will not be called if `gnus-visual' is nil.
721 The default function `gnus-summary-highlight-line' will
722 highlight the line according to the `gnus-summary-highlight'
724 :group 'gnus-summary-visual
727 (defcustom gnus-mark-article-hook '(gnus-summary-mark-read-and-unread-as-read)
728 "*A hook called when an article is selected for the first time.
729 The hook is intended to mark an article as read (or unread)
730 automatically when it is selected."
731 :group 'gnus-summary-choose
734 (defcustom gnus-group-no-more-groups-hook nil
735 "*A hook run when returning to group mode having no more (unread) groups."
736 :group 'gnus-group-select
739 (defface gnus-summary-selected-face '((t
741 "Face used for selected articles.")
743 (defcustom gnus-summary-selected-face 'gnus-summary-selected-face
744 "Face used for highlighting the current article in the summary buffer."
745 :group 'gnus-summary-visual
748 (defface gnus-summary-cancelled-face
750 (:foreground "yellow" :background "black")))
751 "Face used for cancelled articles.")
753 (defface gnus-summary-high-ticked-face
756 (:foreground "pink" :bold t))
759 (:foreground "firebrick" :bold t))
762 "Face used for high interest ticked articles.")
764 (defface gnus-summary-low-ticked-face
767 (:foreground "pink" :italic t))
770 (:foreground "firebrick" :italic t))
773 "Face used for low interest ticked articles.")
775 (defface gnus-summary-normal-ticked-face
778 (:foreground "pink"))
781 (:foreground "firebrick"))
784 "Face used for normal interest ticked articles.")
786 (defface gnus-summary-high-ancient-face
789 (:foreground "SkyBlue" :bold t))
792 (:foreground "RoyalBlue" :bold t))
795 "Face used for high interest ancient articles.")
797 (defface gnus-summary-low-ancient-face
800 (:foreground "SkyBlue" :italic t))
803 (:foreground "RoyalBlue" :italic t))
806 "Face used for low interest ancient articles.")
808 (defface gnus-summary-normal-ancient-face
811 (:foreground "SkyBlue"))
814 (:foreground "RoyalBlue"))
817 "Face used for normal interest ancient articles.")
819 (defface gnus-summary-high-unread-face
822 "Face used for high interest unread articles.")
824 (defface gnus-summary-low-unread-face
827 "Face used for low interest unread articles.")
829 (defface gnus-summary-normal-unread-face
832 "Face used for normal interest unread articles.")
834 (defface gnus-summary-high-read-face
837 (:foreground "PaleGreen"
841 (:foreground "DarkGreen"
845 "Face used for high interest read articles.")
847 (defface gnus-summary-low-read-face
850 (:foreground "PaleGreen"
854 (:foreground "DarkGreen"
858 "Face used for low interest read articles.")
860 (defface gnus-summary-normal-read-face
863 (:foreground "PaleGreen"))
866 (:foreground "DarkGreen"))
869 "Face used for normal interest read articles.")
871 (defcustom gnus-summary-highlight
872 '(((= mark gnus-canceled-mark)
873 . gnus-summary-cancelled-face)
874 ((and (> score default)
875 (or (= mark gnus-dormant-mark)
876 (= mark gnus-ticked-mark)))
877 . gnus-summary-high-ticked-face)
878 ((and (< score default)
879 (or (= mark gnus-dormant-mark)
880 (= mark gnus-ticked-mark)))
881 . gnus-summary-low-ticked-face)
882 ((or (= mark gnus-dormant-mark)
883 (= mark gnus-ticked-mark))
884 . gnus-summary-normal-ticked-face)
885 ((and (> score default) (= mark gnus-ancient-mark))
886 . gnus-summary-high-ancient-face)
887 ((and (< score default) (= mark gnus-ancient-mark))
888 . gnus-summary-low-ancient-face)
889 ((= mark gnus-ancient-mark)
890 . gnus-summary-normal-ancient-face)
891 ((and (> score default) (= mark gnus-unread-mark))
892 . gnus-summary-high-unread-face)
893 ((and (< score default) (= mark gnus-unread-mark))
894 . gnus-summary-low-unread-face)
895 ((and (= mark gnus-unread-mark))
896 . gnus-summary-normal-unread-face)
898 . gnus-summary-high-read-face)
900 . gnus-summary-low-read-face)
902 . gnus-summary-normal-read-face))
903 "Controls the highlighting of summary buffer lines.
905 A list of (FORM . FACE) pairs. When deciding how a a particular
906 summary line should be displayed, each form is evaluated. The content
907 of the face field after the first true form is used. You can change
908 how those summary lines are displayed, by editing the face field.
910 You can use the following variables in the FORM field.
912 score: The articles score
913 default: The default article score.
914 below: The score below which articles are automatically marked as read.
915 mark: The articles mark."
916 :group 'gnus-summary-visual
917 :type '(repeat (cons (sexp :tag "Form" nil)
920 ;;; Internal variables
922 (defvar gnus-scores-exclude-files nil)
924 (defvar gnus-summary-display-table
925 ;; Change the display table. Odd characters have a tendency to mess
926 ;; up nicely formatted displays - we make all possible glyphs
927 ;; display only a single character.
929 ;; We start from the standard display table, if any.
930 (let ((table (or (copy-sequence standard-display-table)
931 (make-display-table)))
932 ;; Nix out all the control chars...
934 (while (>= (setq i (1- i)) 0)
936 ;; ... but not newline and cr, of course. (cr is necessary for the
937 ;; selective display).
940 ;; We nix out any glyphs over 126 that are not set already.
942 (while (>= (setq i (1- i)) 127)