Mercurial > hg > xemacs-beta
diff lisp/gnus/gnus-cus.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/gnus/gnus-cus.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,670 @@ +;;; gnus-cus.el --- User friendly customization of Gnus +;; Copyright (C) 1995,96 Free Software Foundation, Inc. +;; +;; Author: Per Abrahamsen <abraham@iesd.auc.dk> +;; Keywords: help, news +;; Version: 0.1 + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;;; Code: + +(require 'custom) +(require 'gnus-ems) +(require 'browse-url) +(eval-when-compile (require 'cl)) + +;; The following is just helper functions and data, not meant to be set +;; by the user. +(defun gnus-make-face (color) + ;; Create entry for face with COLOR. + (custom-face-lookup color nil nil nil nil nil)) + +(defvar gnus-face-light-name-list + '("light blue" "light cyan" "light yellow" "light pink" + "pale green" "beige" "orange" "magenta" "violet" "medium purple" + "turquoise")) + +(defvar gnus-face-dark-name-list + '("dark blue" "firebrick" "dark green" "OrangeRed" + "dark khaki" "dark violet" "SteelBlue4")) +; CornflowerBlue SeaGreen OrangeRed SteelBlue4 DeepPink3 +; DarkOlviveGreen4 + +(custom-declare '() + '((tag . "Gnus") + (doc . "\ +The coffee-brewing, all singing, all dancing, kitchen sink newsreader.") + (type . group) + (data + ((tag . "Visual") + (doc . "\ +Gnus can be made colorful and fun or grey and dull as you wish.") + (type . group) + (data + ((tag . "Visual") + (doc . "Enable visual features. +If `visual' is disabled, there will be no menus and few faces. Most of +the visual customization options below will be ignored. Gnus will use +less space and be faster as a result.") + (default . + (summary-highlight group-highlight + article-highlight + mouse-face + summary-menu group-menu article-menu + tree-highlight menu highlight + browse-menu server-menu + page-marker tree-menu binary-menu pick-menu + grouplens-menu)) + (name . gnus-visual) + (type . sexp)) + ((tag . "WWW Browser") + (doc . "\ +WWW Browser to call when clicking on an URL button in the article buffer. + +You can choose between one of the predefined browsers, or `Other'.") + (name . browse-url-browser-function) + (calculate . (cond ((boundp 'browse-url-browser-function) + browse-url-browser-function) + ((fboundp 'w3-fetch) + 'w3-fetch) + ((eq window-system 'x) + 'gnus-netscape-open-url))) + (type . choice) + (data + ((tag . "W3") + (type . const) + (default . w3-fetch)) + ((tag . "Netscape") + (type . const) + (default . browse-url-netscape)) + ((prompt . "Other") + (doc . "\ +You must specify the name of a Lisp function here. The lisp function +should open a WWW browser when called with an URL (a string). +") + (default . __uninitialized__) + (type . symbol)))) + ((tag . "Mouse Face") + (doc . "\ +Face used for group or summary buffer mouse highlighting. +The line beneath the mouse pointer will be highlighted with this +face.") + (name . gnus-mouse-face) + (calculate . (if (gnus-visual-p 'mouse-face 'highlight) + (if (boundp 'gnus-mouse-face) + gnus-mouse-face + 'highlight) + 'default)) + (type . face)) + ((tag . "Article Display") + (doc . "Controls how the article buffer will look. + +If you leave the list empty, the article will appear exactly as it is +stored on the disk. The list entries will hide or highlight various +parts of the article, making it easier to find the information you +want.") + (name . gnus-article-display-hook) + (type . list) + (calculate + . (if (and (string-match "xemacs" emacs-version) + (featurep 'xface)) + '(gnus-article-hide-headers-if-wanted + gnus-article-hide-boring-headers + gnus-article-treat-overstrike + gnus-article-maybe-highlight + gnus-article-display-x-face) + '(gnus-article-hide-headers-if-wanted + gnus-article-hide-boring-headers + gnus-article-treat-overstrike + gnus-article-maybe-highlight))) + (data + ((type . repeat) + (header . nil) + (data + (tag . "Filter") + (type . choice) + (data + ((tag . "Treat Overstrike") + (doc . "\ +Convert use of overstrike into bold and underline. + +Two identical letters separated by a backspace are displayed as a +single bold letter, while a letter followed by a backspace and an +underscore will be displayed as a single underlined letter. This +technique was developed for old line printers (think about it), and is +still in use on some newsgroups, in particular the ClariNet +hierarchy. +") + (type . const) + (default . + gnus-article-treat-overstrike)) + ((tag . "Word Wrap") + (doc . "\ +Format too long lines. +") + (type . const) + (default . gnus-article-word-wrap)) + ((tag . "Remove CR") + (doc . "\ +Remove carriage returns from an article. +") + (type . const) + (default . gnus-article-remove-cr)) + ((tag . "Display X-Face") + (doc . "\ +Look for an X-Face header and display it if present. + +See also `X Face Command' for a definition of the external command +used for decoding and displaying the face. +") + (type . const) + (default . gnus-article-display-x-face)) + ((tag . "Unquote Printable") + (doc . "\ +Transform MIME quoted printable into 8-bit characters. + +Quoted printable is often seen by strings like `=EF' where you would +expect a non-English letter. +") + (type . const) + (default . + gnus-article-de-quoted-unreadable)) + ((tag . "Universal Time") + (doc . "\ +Convert date header to universal time. +") + (type . const) + (default . gnus-article-date-ut)) + ((tag . "Local Time") + (doc . "\ +Convert date header to local timezone. +") + (type . const) + (default . gnus-article-date-local)) + ((tag . "Lapsed Time") + (doc . "\ +Replace date header with a header showing the articles age. +") + (type . const) + (default . gnus-article-date-lapsed)) + ((tag . "Highlight") + (doc . "\ +Highlight headers, citations, signature, and buttons. +") + (type . const) + (default . gnus-article-highlight)) + ((tag . "Maybe Highlight") + (doc . "\ +Highlight headers, signature, and buttons if `Visual' is turned on. +") + (type . const) + (default . + gnus-article-maybe-highlight)) + ((tag . "Highlight Some") + (doc . "\ +Highlight headers, signature, and buttons. +") + (type . const) + (default . gnus-article-highlight-some)) + ((tag . "Highlight Headers") + (doc . "\ +Highlight headers as specified by `Article Header Highlighting'. +") + (type . const) + (default . + gnus-article-highlight-headers)) + ((tag . "Highlight Signature") + (doc . "\ +Highlight the signature as specified by `Article Signature Face'. +") + (type . const) + (default . + gnus-article-highlight-signature)) + ((tag . "Citation") + (doc . "\ +Highlight the citations as specified by `Citation Faces'. +") + (type . const) + (default . + gnus-article-highlight-citation)) + ((tag . "Hide") + (doc . "\ +Hide unwanted headers, excess citation, and the signature. +") + (type . const) + (default . gnus-article-hide)) + ((tag . "Hide Headers If Wanted") + (doc . "\ +Hide headers, but allow user to display them with `t' or `v'. +") + (type . const) + (default . + gnus-article-hide-headers-if-wanted)) + ((tag . "Hide Headers") + (doc . "\ +Hide unwanted headers and possibly sort them as well. +Most likely you want to use `Hide Headers If Wanted' instead. +") + (type . const) + (default . gnus-article-hide-headers)) + ((tag . "Hide Signature") + (doc . "\ +Hide the signature. +") + (type . const) + (default . gnus-article-hide-signature)) + ((tag . "Hide Excess Citations") + (doc . "\ +Hide excess citation. + +Excess is defined by `Citation Hide Percentage' and `Citation Hide Absolute'. +") + (type . const) + (default . + gnus-article-hide-citation-maybe)) + ((tag . "Hide Citations") + (doc . "\ +Hide all cited text. +") + (type . const) + (default . gnus-article-hide-citation)) + ((tag . "Add Buttons") + (doc . "\ +Make URL's into clickable buttons. +") + (type . const) + (default . gnus-article-add-buttons)) + ((prompt . "Other") + (doc . "\ +Name of Lisp function to call. + +Push the `Filter' button to select one of the predefined filters. +") + (type . symbol))))))) + ((tag . "Article Button Face") + (doc . "\ +Face used for highlighting buttons in the article buffer. + +An article button is a piece of text that you can activate by pressing +`RET' or `mouse-2' above it.") + (name . gnus-article-button-face) + (default . bold) + (type . face)) + ((tag . "Article Mouse Face") + (doc . "\ +Face used for mouse highlighting in the article buffer. + +Article buttons will be displayed in this face when the cursor is +above them.") + (name . gnus-article-mouse-face) + (default . highlight) + (type . face)) + ((tag . "Article Signature Face") + (doc . "\ +Face used for highlighting a signature in the article buffer.") + (name . gnus-signature-face) + (default . italic) + (type . face)) + ((tag . "Article Header Highlighting") + (doc . "\ +Controls highlighting of article header. + +Below is a list of article header names, and the faces used for +displaying the name and content of the header. The `Header' field +should contain the name of the header. The field actually contains a +regular expression that should match the beginning of the header line, +but if you don't know what a regular expression is, just write the +name of the header. The second field is the `Name' field, which +determines how the the header name (i.e. the part of the header left +of the `:') is displayed. The third field is the `Content' field, +which determines how the content (i.e. the part of the header right of +the `:') is displayed. + +If you leave the last `Header' field in the list empty, the `Name' and +`Content' fields will determine how headers not listed above are +displayed. + +If you only want to change the display of the name part for a specific +header, specify `None' in the `Content' field. Similarly, specify +`None' in the `Name' field if you only want to leave the name part +alone.") + (name . gnus-header-face-alist) + (type . list) + (calculate + . (cond + ((not (eq gnus-display-type 'color)) + '(("" bold italic))) + ((eq gnus-background-mode 'dark) + (list + (list "From" nil + (custom-face-lookup "light blue" nil nil t t nil)) + (list "Subject" nil + (custom-face-lookup "pink" nil nil t t nil)) + (list "Newsgroups:.*," nil + (custom-face-lookup "yellow" nil nil t t nil)) + (list + "" + (custom-face-lookup "cyan" nil nil t nil nil) + (custom-face-lookup "forestgreen" nil nil nil t + nil)))) + (t + (list + (list "From" nil + (custom-face-lookup "MidnightBlue" nil nil t t nil)) + (list "Subject" nil + (custom-face-lookup "firebrick" nil nil t t nil)) + (list "Newsgroups:.*," nil + (custom-face-lookup "indianred" nil nil t t nil)) + (list "" + (custom-face-lookup + "DarkGreen" nil nil t nil nil) + (custom-face-lookup "DarkGreen" nil nil + nil t nil)))))) + (data + ((type . repeat) + (header . nil) + (data + (type . list) + (compact . t) + (data + ((type . string) + (prompt . "Header") + (tag . "Header ")) + "\n " + ((type . face) + (prompt . "Name") + (tag . "Name ")) + "\n " + ((type . face) + (tag . "Content")) + "\n"))))) + ((tag . "Attribution Face") + (doc . "\ +Face used for attribution lines. +It is merged with the face for the cited text belonging to the attribution.") + (name . gnus-cite-attribution-face) + (default . underline) + (type . face)) + ((tag . "Citation Faces") + (doc . "\ +List of faces used for highlighting citations. + +When there are citations from multiple articles in the same message, +Gnus will try to give each citation from each article its own face. +This should make it easier to see who wrote what.") + (name . gnus-cite-face-list) + (import . gnus-custom-import-cite-face-list) + (type . list) + (calculate . (cond ((not (eq gnus-display-type 'color)) + '(italic)) + ((eq gnus-background-mode 'dark) + (mapcar 'gnus-make-face + gnus-face-light-name-list)) + (t + (mapcar 'gnus-make-face + gnus-face-dark-name-list)))) + (data + ((type . repeat) + (header . nil) + (data (type . face) + (tag . "Face"))))) + ((tag . "Citation Hide Percentage") + (doc . "\ +Only hide excess citation if above this percentage of the body.") + (name . gnus-cite-hide-percentage) + (default . 50) + (type . integer)) + ((tag . "Citation Hide Absolute") + (doc . "\ +Only hide excess citation if above this number of lines in the body.") + (name . gnus-cite-hide-absolute) + (default . 10) + (type . integer)) + ((tag . "Summary Selected Face") + (doc . "\ +Face used for highlighting the current article in the summary buffer.") + (name . gnus-summary-selected-face) + (default . underline) + (type . face)) + ((tag . "Summary Line Highlighting") + (doc . "\ +Controls the highlighting of summary buffer lines. + +Below is a list of `Form'/`Face' pairs. When deciding how a a +particular summary line should be displayed, each form is +evaluated. The content of the face field after the first true form is +used. You can change how those summary lines are displayed, by +editing the face field. + +It is also possible to change and add form fields, but currently that +requires an understanding of Lisp expressions. Hopefully this will +change in a future release. For now, you can use the following +variables in the Lisp expression: + +score: The article's score +default: The default article score. +below: The score below which articles are automatically marked as read. +mark: The article's mark.") + (name . gnus-summary-highlight) + (type . list) + (calculate + . (cond + ((not (eq gnus-display-type 'color)) + '(((> score default) . bold) + ((< score default) . italic))) + ((eq gnus-background-mode 'dark) + (list + (cons + '(= mark gnus-canceled-mark) + (custom-face-lookup "yellow" "black" nil + nil nil nil)) + (cons '(and (> score default) + (or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark))) + (custom-face-lookup + "pink" nil nil t nil nil)) + (cons '(and (< score default) + (or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark))) + (custom-face-lookup "pink" nil nil + nil t nil)) + (cons '(or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark)) + (custom-face-lookup + "pink" nil nil nil nil nil)) + + (cons + '(and (> score default) (= mark gnus-ancient-mark)) + (custom-face-lookup "medium blue" nil nil t + nil nil)) + (cons + '(and (< score default) (= mark gnus-ancient-mark)) + (custom-face-lookup "SkyBlue" nil nil + nil t nil)) + (cons + '(= mark gnus-ancient-mark) + (custom-face-lookup "SkyBlue" nil nil + nil nil nil)) + (cons '(and (> score default) (= mark gnus-unread-mark)) + (custom-face-lookup "white" nil nil t + nil nil)) + (cons '(and (< score default) (= mark gnus-unread-mark)) + (custom-face-lookup "white" nil nil + nil t nil)) + (cons '(= mark gnus-unread-mark) + (custom-face-lookup + "white" nil nil nil nil nil)) + + (cons '(> score default) 'bold) + (cons '(< score default) 'italic))) + (t + (list + (cons + '(= mark gnus-canceled-mark) + (custom-face-lookup + "yellow" "black" nil nil nil nil)) + (cons '(and (> score default) + (or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark))) + (custom-face-lookup "firebrick" nil nil + t nil nil)) + (cons '(and (< score default) + (or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark))) + (custom-face-lookup "firebrick" nil nil + nil t nil)) + (cons + '(or (= mark gnus-dormant-mark) + (= mark gnus-ticked-mark)) + (custom-face-lookup + "firebrick" nil nil nil nil nil)) + + (cons '(and (> score default) (= mark gnus-ancient-mark)) + (custom-face-lookup "RoyalBlue" nil nil + t nil nil)) + (cons '(and (< score default) (= mark gnus-ancient-mark)) + (custom-face-lookup "RoyalBlue" nil nil + nil t nil)) + (cons + '(= mark gnus-ancient-mark) + (custom-face-lookup + "RoyalBlue" nil nil nil nil nil)) + + (cons '(and (> score default) (/= mark gnus-unread-mark)) + (custom-face-lookup "DarkGreen" nil nil + t nil nil)) + (cons '(and (< score default) (/= mark gnus-unread-mark)) + (custom-face-lookup "DarkGreen" nil nil + nil t nil)) + (cons + '(/= mark gnus-unread-mark) + (custom-face-lookup "DarkGreen" nil nil + nil nil nil)) + + (cons '(> score default) 'bold) + (cons '(< score default) 'italic))))) + (data + ((type . repeat) + (header . nil) + (data (type . pair) + (compact . t) + (data ((type . sexp) + (width . 60) + (tag . "Form")) + "\n " + ((type . face) + (tag . "Face")) + "\n"))))) + + ((tag . "Group Line Highlighting") + (doc . "\ +Controls the highlighting of group buffer lines. + +Below is a list of `Form'/`Face' pairs. When deciding how a a +particular group line should be displayed, each form is +evaluated. The content of the face field after the first true form is +used. You can change how those group lines are displayed by +editing the face field. + +It is also possible to change and add form fields, but currently that +requires an understanding of Lisp expressions. Hopefully this will +change in a future release. For now, you can use the following +variables in the Lisp expression: + +group: The name of the group. +unread: The number of unread articles in the group. +method: The select method used. +mailp: Whether it's a mail group or not. +level: The level of the group. +score: The score of the group. +ticked: The number of ticked articles.") + (name . gnus-group-highlight) + (type . list) + (calculate + . (cond + ((not (eq gnus-display-type 'color)) + '((mailp . bold) + ((= unread 0) . italic))) + ((eq gnus-background-mode 'dark) + `(((and (not mailp) (eq level 1)) . + ,(custom-face-lookup "PaleTurquoise" nil nil t)) + ((and (not mailp) (eq level 2)) . + ,(custom-face-lookup "turquoise" nil nil t)) + ((and (not mailp) (eq level 3)) . + ,(custom-face-lookup "MediumTurquoise" nil nil t)) + ((and (not mailp) (>= level 4)) . + ,(custom-face-lookup "DarkTurquoise" nil nil t)) + ((and mailp (eq level 1)) . + ,(custom-face-lookup "aquamarine1" nil nil t)) + ((and mailp (eq level 2)) . + ,(custom-face-lookup "aquamarine2" nil nil t)) + ((and mailp (eq level 3)) . + ,(custom-face-lookup "aquamarine3" nil nil t)) + ((and mailp (>= level 4)) . + ,(custom-face-lookup "aquamarine4" nil nil t)) + )) + (t + `(((and (not mailp) (<= level 3)) . + ,(custom-face-lookup "ForestGreen" nil nil t)) + ((and (not mailp) (eq level 4)) . + ,(custom-face-lookup "DarkGreen" nil nil t)) + ((and (not mailp) (eq level 5)) . + ,(custom-face-lookup "CadetBlue4" nil nil t)) + ((and mailp (eq level 1)) . + ,(custom-face-lookup "DeepPink3" nil nil t)) + ((and mailp (eq level 2)) . + ,(custom-face-lookup "HotPink3" nil nil t)) + ((and mailp (eq level 3)) . + ,(custom-face-lookup "dark magenta" nil nil t)) + ((and mailp (eq level 4)) . + ,(custom-face-lookup "DeepPink4" nil nil t)) + ((and mailp (> level 4)) . + ,(custom-face-lookup "DarkOrchid4" nil nil t)) + )))) + (data + ((type . repeat) + (header . nil) + (data (type . pair) + (compact . t) + (data ((type . sexp) + (width . 60) + (tag . "Form")) + "\n " + ((type . face) + (tag . "Face")) + "\n"))))) + + ;; Do not define `gnus-button-alist' before we have + ;; some `complexity' attribute so we can hide it from + ;; beginners. + ))))) + +(defun gnus-custom-import-cite-face-list (custom alist) + ;; Backward compatible grokking of light and dark. + (cond ((eq alist 'light) + (setq alist (mapcar 'gnus-make-face gnus-face-light-name-list))) + ((eq alist 'dark) + (setq alist (mapcar 'gnus-make-face gnus-face-dark-name-list)))) + (funcall (custom-super custom 'import) custom alist)) + +(provide 'gnus-cus) + +;;; gnus-cus.el ends here