Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

*** empty log message ***

  • Loading branch information...
1 parent 6864d4a commit 42e28f7726b7a79a3cb0fff60c92eea2675570e5 @larsmagne larsmagne committed
@@ -25,3 +25,23 @@ values.
*** A new Message command for deleting text in the body of a message
outside the region: `C-c C-v'.
+*** You can now post to component group in nnvirtual groups with
+`C-u C-c C-c'.
+*** `nntp-rlogin-program' -- new variable to ease customization.
+*** `C-u C-c C-c' in `gnus-article-edit-mode' will now inhibit
+re-highlighting of the article buffer.
+*** New element in `gnus-boring-article-headers' -- `long-to'.
+*** `M-i' symbolic prefix command. See the section "Symbolic
+Prefixes" in the Gnus manual for details.
+*** `L' and `I' in the summary buffer now take the symbolic prefix
+`a' to add the score rule to the "all.SCORE" file.
+*** `gnus-simplify-subject-functions' variable to allow greater
+control over simplification.
104 lisp/ChangeLog
@@ -1,3 +1,107 @@
+Sun Sep 21 23:54:50 1997 Lars Magne Ingebrigtsen <>
+ * gnus.el: Quassia Gnus v0.9 is released.
+Sun Sep 21 23:38:46 1997 Lars Magne Ingebrigtsen <>
+ * gnus.el (gnus-splash-face): ForestGreen everywhere.
+ * gnus-sum.el (gnus-simplify-subject-fully): Use new variable.
+ (gnus-general-simplify-subject): Ditto.
+Sun Sep 21 23:34:13 1997 Kurt Swanson <>
+ * gnus-sum.el (gnus-simplify-subject-functions): New variable.
+ (gnus-simplify-whitespace): New function.
+ * gnus-util.el (gnus-map-function): New function.
+Sun Sep 21 23:22:04 1997 Michelangelo Grigni <>
+ * gnus-score.el (gnus-score-regexp-bad-p): New function.
+Sun Sep 21 00:14:40 1997 Lars Magne Ingebrigtsen <>
+ * gnus-score.el (gnus-summary-lower-score): Use sym pref.
+ (gnus-summary-increase-score): Use it.
+ * gnus.el (gnus-current-prefix-symbol): New variable.
+ (gnus-current-prefix-symbols): New variable.
+ * gnus-score.el (gnus-summary-increase-score): Take symbolic
+ prefix.
+ * gnus.el (gnus-interactive): Removed.
+ (gnus-interactive): Renamed from gnus-interactive-1.
+ (gnus-symbolic-argument): New command.
+ * gnus-draft.el (gnus-draft-send-message): Disable message
+ checks.
+ (gnus-draft-send): Ditto.
+ (gnus-draft-setup): Don't save buffer.
+ * dgnushack.el (dgnushack-compile): Warn people about Custom.
+ * gnus-group.el (gnus-group-iterate): Use gensymmed variables.
+ * pop3.el (pop3-md5): `with-temp-buffer' doesn't exist in Emacs
+ 19.34.
+ * nneething.el (nneething-directory): Defvarred.
+ * message.el: Autoloaded nndraft things.
+ (message-set-auto-save-file-name): Use it.
+ * dgnushack.el (dgnushack-compile): Warn about things.
+ * gnus-art.el: Autoload w3-region.
+ * gnus-vm.el (gnus-summary-save-in-vm): Simplified.
+ * gnus.el: Changed `compiled-function-p' to `byte-code-function-p'
+ throughout.
+ * gnus-sum.el (gnus-summary-edit-article): Supply additional
+ param.
+ * gnus-group.el (gnus-group-iterate): Undo bogus change.
+ * gnus-agent.el (gnus-agentize): Just call gnus-open-agent
+ directly.
+ * gnus.el (gnus-interactive): New macro.
+ (gnus-interactive-1): New function.
+ * gnus-sum.el (gnus-fetch-old-headers): Allow `invisible'.
+ (gnus-cut-thread): Use it.
+ (gnus-cut-threads): Ditto.
+ (gnus-summary-initial-limit): Ditto.
+ (gnus-summary-limit-children): Ditto.
+ * gnus-art.el (gnus-article-edit-done): Accept a prefix arg.
+ (gnus-boring-article-headers): Allow `long-to' param.
+ (article-hide-boring-headers): Use it.
+ * gnus-sum.el (gnus-summary-edit-article-done): Accept a
+ no-highlight param.
+ * nntp.el (nntp-rlogin-program): New variable.
+ (nntp-open-rlogin): Use it.
+ * nnvirtual.el (nnvirtual-request-post): New function.
+ * gnus-msg.el (gnus-message-group-art): New variable.
+ * gnus-draft.el (gnus-draft-setup): Don't use message-setup.
+ * nndraft.el (nndraft): Allow editing articles.
+ * gnus-ems.el (gnus-x-splash): Ditto.
+ * gnus.el (gnus-splash-face): Darker face.
+ * gnus-draft.el (gnus-draft-setup): Clobbered variables.
Sat Sep 20 23:23:49 1997 Lars Magne Ingebrigtsen <>
* gnus.el: Quassia Gnus v0.8 is released.
12 lisp/dgnushack.el
@@ -53,17 +53,25 @@
(defun dgnushack-compile ()
;;(setq byte-compile-dynamic t)
+ (unless (locate-library "custom")
+ (error "You do not seem to have Custom installed.
+Fetch it from <URL:>.
+You also then need to add the following to the lisp/dgnushack.el file:
+ (push \"~/lisp/custom\" load-path)
+Modify to suit your needs."))
(let ((files (directory-files "." nil "^[^=].*\\.el$"))
(xemacs (string-match "XEmacs" emacs-version))
;;(byte-compile-generate-call-tree t)
- byte-compile-warnings file elc)
+ file elc)
(condition-case ()
(require 'w3-forms)
(error (setq files (delete "nnweb.el" files))))
(while (setq file (pop files))
(when (or (not (member file '("gnus-xmas.el" "gnus-picon.el"
"messagexmas.el" "nnheaderxm.el"
- "smiley.el")))
+ "smiley.el" "x-overlay.el")))
(when (or (not (file-exists-p (setq elc (concat file "c"))))
(file-newer-than-file-p file elc))
2  lisp/gnus-agent.el
@@ -242,7 +242,7 @@ This will modify the `gnus-before-startup-hook', `gnus-post-method',
and `message-send-mail-function' variables, and install the Gnus
agent minor mode in all Gnus buffers."
- (add-hook 'gnus-before-startup-hook 'gnus-open-agent)
+ (gnus-open-agent)
(add-hook 'gnus-setup-news-hook 'gnus-agent-queue-setup)
(unless gnus-agent-send-mail-function
(setq gnus-agent-send-mail-function message-send-mail-function
22 lisp/gnus-art.el
@@ -134,7 +134,8 @@ Possible values in this list are `empty', `newsgroups', `followup-to',
(const :tag "Newsgroups with only one group." newsgroups)
(const :tag "Followup-to identical to newsgroups." followup-to)
(const :tag "Reply-to identical to from." reply-to)
- (const :tag "Date less than four days old." date))
+ (const :tag "Date less than four days old." date)
+ (const :tag "Very long To header." long-to))
:group 'gnus-article-hiding)
(defcustom gnus-signature-separator '("^-- $" "^-- *$")
@@ -742,7 +743,11 @@ always hide."
(when (and date
(< (gnus-days-between (current-time-string) date)
- (gnus-article-hide-header "date")))))))))))
+ (gnus-article-hide-header "date"))))
+ ((eq elem 'long-to)
+ (let ((to (message-fetch-field "to")))
+ (when (> (length to) 1024)
+ (gnus-article-hide-header "to")))))))))))
(defun gnus-article-hide-header (header)
@@ -1129,7 +1134,8 @@ Put point at the beginning of the signature separator."
(autoload 'w3-display "w3-parse")
- (autoload 'w3-do-setup "w3" "" t))
+ (autoload 'w3-do-setup "w3" "" t)
+ (autoload 'w3-region "w3-display" "" t))
(defun gnus-article-treat-html ()
"Render HTML."
@@ -2477,10 +2483,10 @@ groups."
(error "The current newsgroup does not support article editing"))
- `(lambda ()
+ `(lambda (no-highlight)
,(or (mail-header-references gnus-current-headers) "")
- ,(gnus-group-read-only-p) ,gnus-summary-buffer))))
+ ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight))))
(defun gnus-article-edit-article (exit-func)
"Start editing the contents of the current article buffer."
@@ -2493,9 +2499,9 @@ groups."
(setq gnus-prev-winconf winconf)
(gnus-message 6 "C-c C-c to end edits")))
-(defun gnus-article-edit-done ()
+(defun gnus-article-edit-done (&optional arg)
"Update the article edits and exit."
- (interactive)
+ (interactive "P")
(let ((func gnus-article-edit-done-function)
(buf (current-buffer))
(start (window-start)))
@@ -2503,7 +2509,7 @@ groups."
(set-buffer buf)
(let ((buffer-read-only nil))
- (funcall func)))
+ (funcall func arg)))
(set-buffer buf)
(set-window-start (get-buffer-window buf) start)
(set-window-point (get-buffer-window buf) (point))))
14 lisp/gnus-draft.el
@@ -29,6 +29,7 @@
(require 'gnus-sum)
(require 'message)
(require 'gnus-msg)
+(require 'nndraft)
(eval-when-compile (require 'cl))
;;; Draft minor mode
@@ -112,9 +113,9 @@
(defun gnus-draft-send (article)
"Send message ARTICLE."
- (message "In gnus-draft-send, article is %s" article)
(gnus-draft-setup article "nndraft:queue")
- (message-send-and-exit))
+ (let ((message-syntax-checks 'dont-check-for-anything-just-trust-me))
+ (message-send-and-exit)))
(defun gnus-draft-send-all-messages ()
"Send all the sendable drafts."
@@ -139,21 +140,18 @@
;;; Utility functions
-(defun gnus-draft-setup (article group)
- (message "In gnus-draft-setup, article is %s %s" article group)
+(defun gnus-draft-setup (narticle group)
(gnus-setup-message 'forward
- (message "Article is %s" article)
- (if (not (gnus-request-restore-buffer article group))
+ (if (not (gnus-request-restore-buffer narticle group))
(error "Couldn't restore the article")
;; Insert the separator.
(goto-char (point-min))
(search-forward "\n\n")
(forward-char -1)
(insert mail-header-separator)
- (forward-line 1)
- (save-buffer 0))))
+ (forward-line 1))))
(defun gnus-draft-article-sendable-p (article)
"Say whether ARTICLE is sendable."
4 lisp/gnus-ems.el
@@ -224,7 +224,7 @@
(let ((dir (nnheader-find-etc-directory "gnus"))
pixmap file height beg i)
- (switch-to-buffer gnus-group-buffer)
+ (switch-to-buffer (get-buffer-create gnus-group-buffer))
(let ((buffer-read-only nil))
(when (and dir
@@ -240,7 +240,7 @@
(make-face 'gnus-splash))
(setq height (/ (car pixmap) (frame-char-height))
width (/ (cadr pixmap) (frame-char-width)))
- (set-face-foreground 'gnus-splash "green")
+ (set-face-foreground 'gnus-splash "ForestGreen")
(set-face-stipple 'gnus-splash pixmap)
(insert-char ?\n (* (/ (window-height) 2 height) height))
(setq i height)
35 lisp/gnus-group.el
@@ -810,7 +810,7 @@ The following commands are available:
(or level gnus-group-default-list-level gnus-level-subscribed))))
(defun gnus-group-setup-buffer ()
- (switch-to-buffer gnus-group-buffer)
+ (switch-to-buffer (get-buffer-create gnus-group-buffer))
(unless (eq major-mode 'gnus-group-mode)
@@ -1444,20 +1444,25 @@ Take into consideration N (the prefix) and the list of marked groups."
(let ((group (gnus-group-group-name)))
(and group (list group))))))
-;;;!!! All the variables below should be gensymmed.
-(defun gnus-group-iterate (arg gnus-group-iterate-function)
- "Iterate FUNCTION over all process/prefixed groups.
- FUNCTION will be called with the group name as the paremeter
- and with point over the group in question."
- (let ((groups (gnus-group-process-prefix arg))
- (window (selected-window))
- group)
- (while (setq group (pop groups))
- (select-window window)
- (gnus-group-remove-mark group)
- (save-selected-window
- (save-excursion
- (funcall function group))))))
+ (let ((function (make-symbol "gnus-group-iterate-function"))
+ (window (make-symbol "gnus-group-iterate-window"))
+ (groups (make-symbol "gnus-group-iterate-groups"))
+ (group (make-symbol "gnus-group-iterate-group")))
+ (eval
+ `(defun gnus-group-iterate (arg ,function)
+ "Iterate FUNCTION over all process/prefixed groups.
+FUNCTION will be called with the group name as the paremeter
+and with point over the group in question."
+ (let ((,groups (gnus-group-process-prefix arg))
+ (,window (selected-window))
+ ,group)
+ (while (setq ,group (pop ,groups))
+ (select-window ,window)
+ (gnus-group-remove-mark ,group)
+ (save-selected-window
+ (save-excursion
+ (funcall ,function ,group)))))))))
(put 'gnus-group-iterate 'lisp-indent-function 1)
5 lisp/gnus-msg.el
@@ -99,6 +99,7 @@ the second with the current group name.")
(defvar gnus-message-buffer "*Mail Gnus*")
(defvar gnus-article-copy nil)
(defvar gnus-last-posting-server nil)
+(defvar gnus-message-group-art nil)
(defconst gnus-bug-message
"Sending a bug report to the Gnus Towers.
@@ -176,6 +177,8 @@ Thank you for your help in stamping out bugs.
(gnus-inews-add-send-actions ,winconf ,buffer ,article)
(setq gnus-message-buffer (current-buffer))
+ (set (make-local-variable 'gnus-message-group-art)
+ (cons ,gnus-newsgroup-name ,article))
(make-local-variable 'gnus-newsgroup-name)
(run-hooks 'gnus-message-setup-hook))
(gnus-configure-windows ,config t)
@@ -802,7 +805,7 @@ If YANK is non-nil, include the original article."
(error "Gnus has been shut down"))
(gnus-setup-message 'bug
- (switch-to-buffer "*Gnus Help Bug*")
+ (switch-to-buffer (get-buffer-create "*Gnus Help Bug*"))
(insert gnus-bug-message)
(goto-char (point-min))
82 lisp/gnus-score.el
@@ -449,13 +449,13 @@ of the last successful match.")
;; Much modification of the kill (ahem, score) code and lots of the
;; functions are written by Per Abrahamsen <>.
-(defun gnus-summary-lower-score (&optional score)
+(defun gnus-summary-lower-score (&optional score symp)
"Make a score entry based on the current article.
The user will be prompted for header to score on, match type,
permanence, and the string to be used. The numerical prefix will be
used as score."
- (interactive "P")
- (gnus-summary-increase-score (- (gnus-score-default score))))
+ (interactive (gnus-interactive "P\ny"))
+ (gnus-summary-increase-score (- (gnus-score-default score)) symp))
(defun gnus-score-kill-help-buffer ()
(when (get-buffer "*Score Help*")
@@ -463,12 +463,12 @@ used as score."
(when gnus-score-help-winconf
(set-window-configuration gnus-score-help-winconf))))
-(defun gnus-summary-increase-score (&optional score)
+(defun gnus-summary-increase-score (&optional score symp)
"Make a score entry based on the current article.
The user will be prompted for header to score on, match type,
permanence, and the string to be used. The numerical prefix will be
used as score."
- (interactive "P")
+ (interactive (gnus-interactive "P\ny"))
(let* ((nscore (gnus-score-default score))
(prefix (if (< nscore 0) ?L ?I))
@@ -498,6 +498,7 @@ used as score."
(?< < "less than number" number)
(?> > "greater than number" number)
(?= = "equal to number" number)))
+ (current-score-file gnus-current-score-file)
(list (list ?t (current-time-string) "temporary")
'(?p perm "permanent") '(?i now "immediate")))
@@ -615,6 +616,13 @@ used as score."
(when (memq type '(r R regexp Regexp))
(setq match (regexp-quote match)))
+ ;; Change score file to the "all.SCORE" file.
+ (when (eq symp 'a)
+ (save-excursion
+ (set-buffer gnus-summary-buffer)
+ (gnus-score-load-file
+ (gnus-score-file-name "all"))))
(nth 1 entry) ; Header
match ; Match
@@ -624,7 +632,12 @@ used as score."
(not (nth 3 entry))) ; Prompt
- ))
+ (when (eq symp 'a)
+ ;; We change the score file back to the previous one.
+ (save-excursion
+ (set-buffer gnus-summary-buffer)
+ (gnus-score-load-file current-score-file)))))
(defun gnus-score-insert-help (string alist idx)
(setq gnus-score-help-winconf (current-window-configuration))
@@ -2762,6 +2775,63 @@ If ADAPT, return the home adaptive file instead."
;; Return whether this score file needs to be saved. By Je-haysuss!
+(defun gnus-score-regexp-bad-p (regexp)
+ "Test whether REGEXP is safe for Gnus scoring.
+A regexp is unsafe if it matches newline or a buffer boundary.
+If the regexp is good, return nil. If the regexp is bad, return a
+cons cell (SYM . STRING), where the symbol SYM is `new' or `bad'.
+In the `new' case, the string is a safe replacement for REGEXP.
+In the `bad' case, the string is a unsafe subexpression of REGEXP,
+and we do not have a simple replacement to suggest.
+See `(Gnus)Scoring Tips' for examples of good regular expressions."
+ (let (case-fold-search)
+ (and
+ ;; First, try a relatively fast necessary condition.
+ ;; Notice ranges (like [^:] or [\t-\r]), \s>, \Sw, \W, \', \`:
+ (string-match "\n\\|\\\\[SsW`']\\|\\[\\^\\|[\0-\n]-" regexp)
+ ;; Now break the regexp into tokens, and check each:
+ (let ((tail regexp) ; remaining regexp to check
+ tok ; current token
+ bad ; nil, or bad subexpression
+ new ; nil, or replacement regexp so far
+ end) ; length of current token
+ (while (and (not bad)
+ (string-match
+ "\\`\\(\\\\[sS]?.\\|\\[\\^?]?[^]]*]\\|[^\\]\\)"
+ tail))
+ (setq end (match-end 0)
+ tok (substring tail 0 end)
+ tail (substring tail end))
+ (if;; Is token `bad' (matching newline or buffer ends)?
+ (or (member tok '("\n" "\\W" "\\`" "\\'"))
+ ;; This next handles "[...]", "\\s.", and "\\S.":
+ (and (> end 2) (string-match tok "\n")))
+ (let ((newtok
+ ;; Try to suggest a replacement for tok ...
+ (cond ((string-equal tok "\\`") "^") ; or "\\(^\\)"
+ ((string-equal tok "\\'") "$") ; or "\\($\\)"
+ ((string-match "\\[\\^" tok) ; very common
+ (concat (substring tok 0 -1) "\n]")))))
+ (if newtok
+ (setq new
+ (concat
+ (or new
+ ;; good prefix so far:
+ (substring regexp 0 (- (+ (length tail) end))))
+ newtok))
+ ;; No replacement idea, so give up:
+ (setq bad tok)))
+ ;; tok is good, may need to extend new
+ (and new (setq new (concat new tok)))))
+ ;; Now return a value:
+ (cond
+ (bad (cons 'bad bad))
+ (new (cons 'new new))
+ ;; or nil
+ )))))
(provide 'gnus-score)
;;; gnus-score.el ends here
113 lisp/gnus-sum.el
@@ -47,10 +47,11 @@ If an unread article in the group refers to an older, already read (or
just marked as read) article, the old article will not normally be
displayed in the Summary buffer. If this variable is non-nil, Gnus
will attempt to grab the headers to the old articles, and thereby
-build complete threads. If it has the value `some', only enough
-headers to connect otherwise loose threads will be displayed.
-This variable can also be a number. In that case, no more than that
-number of old headers will be fetched.
+build complete threads. If it has the value `some', only enough
+headers to connect otherwise loose threads will be displayed. This
+variable can also be a number. In that case, no more than that number
+of old headers will be fetched. If it has the value `invisible', all
+old headers will be fetched, but none will be displayed.
The server has to support NOV for any of this to work."
:group 'gnus-thread
@@ -111,6 +112,12 @@ comparing subjects."
(const fuzzy)
(sexp :menu-tag "on" t)))
+(defcustom gnus-simplify-subject-functions nil
+ "List of functions taking a string argument that simplify subjects.
+The functions are applied recursively."
+ :group 'gnus-thread
+ :type '(repeat (list function)))
(defcustom gnus-simplify-ignored-prefixes nil
"*Regexp, matches for which are removed from subject lines when simplifying fuzzily."
:group 'gnus-thread
@@ -140,7 +147,6 @@ headers of the articles to find matches."
(function-item gnus-gather-threads-by-references)
(function :tag "other")))
-;; Added by Per Abrahamsen <>.
(defcustom gnus-summary-same-subject ""
"*String indicating that the current article has the same subject as the previous.
This variable will only be used if the value of
@@ -965,6 +971,22 @@ variable (string, integer, character, etc).")
;; Subject simplification.
+(defun gnus-simplify-whitespace (str)
+ "Remove excessive whitespace."
+ (let ((mystr str))
+ ;; Multiple spaces.
+ (while (string-match "[ \t][ \t]+" mystr)
+ (setq mystr (concat (substring mystr 0 (match-beginning 0))
+ " "
+ (substring mystr (match-end 0)))))
+ ;; Leading spaces.
+ (when (string-match "^[ \t]+" mystr)
+ (setq mystr (substring mystr (match-end 0))))
+ ;; Trailing spaces.
+ (when (string-match "[ \t]+$" mystr)
+ (setq mystr (substring mystr 0 (match-beginning 0))))
+ mystr))
(defsubst gnus-simplify-subject-re (subject)
"Remove \"Re:\" from subject lines."
(if (string-match "^[Rr][Ee]: *" subject)
@@ -1028,7 +1050,7 @@ gnus-simplify-subject-fuzzy-regexp."
(defun gnus-simplify-subject-fuzzy (subject)
"Simplify a subject string fuzzily.
-See gnus-simplify-buffer-fuzzy for details."
+See `gnus-simplify-buffer-fuzzy' for details."
(let ((case-fold-search t))
@@ -1039,6 +1061,8 @@ See gnus-simplify-buffer-fuzzy for details."
(defsubst gnus-simplify-subject-fully (subject)
"Simplify a subject string according to gnus-summary-gather-subject-limit."
+ (gnus-simplify-subject-functions
+ (gnus-map-function gnus-simplify-subject-functions subject))
((null gnus-summary-gather-subject-limit)
(gnus-simplify-subject-re subject))
((eq gnus-summary-gather-subject-limit 'fuzzy)
@@ -1050,8 +1074,9 @@ See gnus-simplify-buffer-fuzzy for details."
(defsubst gnus-subject-equal (s1 s2 &optional simple-first)
- "Check whether two subjects are equal. If optional argument
-simple-first is t, first argument is already simplified."
+ "Check whether two subjects are equal.
+If optional argument simple-first is t, first argument is already
((null simple-first)
(equal (gnus-simplify-subject-fully s1)
@@ -1172,7 +1197,8 @@ increase the score of each group you read."
"\C-l" gnus-recenter
"I" gnus-summary-increase-score
"L" gnus-summary-lower-score
+ "\M-i" gnus-symbolic-argument
"V" gnus-summary-score-map
"X" gnus-uu-extract-map
"S" gnus-summary-send-map)
@@ -2705,6 +2731,8 @@ If NO-DISPLAY, don't generate a summary buffer."
(setq subject
;; Truncate the subject.
+ (gnus-simplify-subject-functions
+ (gnus-map-function gnus-simplify-subject-functions subject))
((numberp gnus-summary-gather-subject-limit)
(setq subject (gnus-simplify-subject-re subject))
(if (> (length subject) gnus-summary-gather-subject-limit)
@@ -2865,7 +2893,7 @@ If NO-DISPLAY, don't generate a summary buffer."
(let ((headers gnus-newsgroup-headers)
(deps gnus-newsgroup-dependencies)
header references generation relations
- cthread subject child end pthread relation)
+ cthread subject child end pthread relation new-child)
;; First we create an alist of generations/relations, where
;; generations is how much we trust the relation, and the relation
;; is parent/child.
@@ -4089,7 +4117,8 @@ The resulting hash table is returned, or nil if no Xrefs were found."
(defun gnus-compute-read-articles (group articles)
(let* ((entry (gnus-gethash group gnus-newsrc-hashtb))
(info (nth 2 entry))
- (active (gnus-active group)))
+ (active (gnus-active group))
+ ninfo)
(when entry
;; First peel off all illegal article numbers.
(when active
@@ -5863,7 +5892,7 @@ If REVERSE (the prefix), limit the summary buffer to articles that are
not marked with MARKS. MARKS can either be a string of marks or a
list of marks.
Returns how many articles were removed."
- (interactive (list (read-string "Marks: ") current-prefix-arg))
+ (interactive "sMarks: \nP")
(let ((data gnus-newsgroup-data)
@@ -6013,6 +6042,7 @@ If ALL, mark even excluded ticked and dormants as read."
(defsubst gnus-cut-thread (thread)
"Go forwards in the thread until we find an article that we want to display."
(when (or (eq gnus-fetch-old-headers 'some)
+ (eq gnus-fetch-old-headers 'invisible)
(eq gnus-build-sparse-threads 'some)
(eq gnus-build-sparse-threads 'more))
;; Deal with old-fetched headers and sparse threads.
@@ -6022,25 +6052,26 @@ If ALL, mark even excluded ticked and dormants as read."
(gnus-summary-article-sparse-p (mail-header-number (car thread)))
(mail-header-number (car thread))))
- (progn
- (if (<= (length (cdr thread)) 1)
- (setq gnus-newsgroup-limit
- (delq (mail-header-number (car thread))
+ (if (or (<= (length (cdr thread)) 1)
+ (eq gnus-fetch-old-headers 'invisible))
+ (setq gnus-newsgroup-limit
+ (delq (mail-header-number (car thread))
+ gnus-newsgroup-limit)
+ thread (cadr thread))
+ (when (gnus-invisible-cut-children (cdr thread))
+ (let ((th (cdr thread)))
+ (while th
+ (if (memq (mail-header-number (caar th))
- thread (cadr thread))
- (when (gnus-invisible-cut-children (cdr thread))
- (let ((th (cdr thread)))
- (while th
- (if (memq (mail-header-number (caar th))
- gnus-newsgroup-limit)
- (setq thread (car th)
- th nil)
- (setq th (cdr th)))))))))))
+ (setq thread (car th)
+ th nil)
+ (setq th (cdr th))))))))))
(defun gnus-cut-threads (threads)
"Cut off all uninteresting articles from the beginning of threads."
(when (or (eq gnus-fetch-old-headers 'some)
+ (eq gnus-fetch-old-headers 'invisible)
(eq gnus-build-sparse-threads 'some)
(eq gnus-build-sparse-threads 'more))
(let ((th threads))
@@ -6058,6 +6089,7 @@ fetch-old-headers verbiage, and so on."
(if (or gnus-inhibit-limiting
(and (null gnus-newsgroup-dormant)
(not (eq gnus-fetch-old-headers 'some))
+ (not (eq gnus-fetch-old-headers 'invisible))
(null gnus-summary-expunge-below)
(not (eq gnus-build-sparse-threads 'some))
(not (eq gnus-build-sparse-threads 'more))
@@ -6113,6 +6145,10 @@ fetch-old-headers verbiage, and so on."
(and (eq gnus-fetch-old-headers 'some)
(gnus-summary-article-ancient-p number)
(zerop children))
+ ;; If this is "fetch-old-headered" and `invisible', then
+ ;; we don't want this article.
+ (and (eq gnus-fetch-old-headers 'invisible)
+ (gnus-summary-article-ancient-p number))
;; If this is a sparsely inserted article with no children,
;; we don't want it.
(and (eq gnus-build-sparse-threads 'some)
@@ -7137,14 +7173,15 @@ groups."
(gnus-summary-select-article t))
- `(lambda ()
+ `(lambda (no-highlight)
,(or (mail-header-references gnus-current-headers) "")
- ,(gnus-group-read-only-p) ,gnus-summary-buffer)))))
+ ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight)))))
(defalias 'gnus-summary-edit-article-postpone 'gnus-article-edit-exit)
-(defun gnus-summary-edit-article-done (&optional references read-only buffer)
+(defun gnus-summary-edit-article-done (&optional references read-only buffer
+ no-highlight)
"Make edits to the current article permanent."
;; Replace the article.
@@ -7186,12 +7223,14 @@ groups."
(set-buffer (or buffer gnus-summary-buffer))
(gnus-summary-update-article (cdr gnus-article-current)))
;; Prettify the article buffer again.
- (save-excursion
- (set-buffer gnus-article-buffer)
- (run-hooks 'gnus-article-display-hook)
- (set-buffer gnus-original-article-buffer)
- (gnus-request-article
- (cdr gnus-article-current) (car gnus-article-current) (current-buffer)))
+ (unless no-highlight
+ (save-excursion
+ (set-buffer gnus-article-buffer)
+ (run-hooks 'gnus-article-display-hook)
+ (set-buffer gnus-original-article-buffer)
+ (gnus-request-article
+ (cdr gnus-article-current)
+ (car gnus-article-current) (current-buffer))))
;; Prettify the summary buffer line.
(when (gnus-visual-p 'summary-highlight 'highlight)
(run-hooks 'gnus-visual-mark-article-hook))))
@@ -7356,7 +7395,7 @@ the actual number of articles marked is returned."
(defun gnus-summary-set-bookmark (article)
"Set a bookmark in current article."
- (interactive (list (gnus-summary-article-number)))
+ (interactive (gnus-summary-article-number))
(when (or (not (get-buffer gnus-article-buffer))
(not gnus-current-article)
@@ -7386,7 +7425,7 @@ the actual number of articles marked is returned."
(defun gnus-summary-remove-bookmark (article)
"Remove the bookmark from the current article."
- (interactive (list (gnus-summary-article-number)))
+ (interactive (gnus-summary-article-number))
;; Remove old bookmark, if one exists.
(let ((old (assq article gnus-newsgroup-bookmarks)))
@@ -8574,7 +8613,7 @@ save those articles instead."
(defun gnus-summary-edit-global-kill (article)
"Edit the \"global\" kill file."
- (interactive (list (gnus-summary-article-number)))
+ (interactive (gnus-summary-article-number))
(gnus-group-edit-global-kill article))
13 lisp/gnus-util.el
@@ -90,7 +90,7 @@
"Return non-nil if FORM is funcallable."
(or (and (symbolp form) (fboundp form))
(and (listp form) (eq (car form) 'lambda))
- (compiled-function-p form)))
+ (byte-code-function-p form)))
(defsubst gnus-goto-char (point)
(and point (goto-char point)))
@@ -146,7 +146,7 @@
(defun gnus-byte-code (func)
"Return a form that can be `eval'ed based on FUNC."
(let ((fval (symbol-function func)))
- (if (compiled-function-p fval)
+ (if (byte-code-function-p fval)
(let ((flist (append fval nil)))
(setcar flist 'byte-code)
@@ -827,6 +827,15 @@ with potentially long computations."
(goto-char (point-max))
(insert "\^_")))
+(defun gnus-map-function (funs arg)
+ "Applies the result of the first function in FUNS to the second, and so on.
+ARG is passed to the first function."
+ (let ((myfuns funs)
+ (myarg arg))
+ (while myfuns
+ (setq arg (funcall (pop myfuns) arg)))
+ arg))
(provide 'gnus-util)
;;; gnus-util.el ends here
10 lisp/gnus-vm.el
@@ -88,12 +88,10 @@ save those articles instead."
(defun gnus-summary-save-in-vm (&optional folder)
(setq folder
- (cond ((eq folder 'default) default-name)
- (folder folder)
- (t (gnus-read-save-file-name
- "Save %s in VM folder:" folder
- gnus-mail-save-name gnus-newsgroup-name
- gnus-current-headers 'gnus-newsgroup-last-mail))))
+ (gnus-read-save-file-name
+ "Save %s in VM folder:" folder
+ gnus-mail-save-name gnus-newsgroup-name
+ gnus-current-headers 'gnus-newsgroup-last-mail))
(gnus-eval-in-buffer-window gnus-original-article-buffer
2  lisp/gnus-xmas.el
@@ -443,7 +443,7 @@ call it with the value of the `gnus-data' text property."
(defun gnus-byte-code (func)
"Return a form that can be `eval'ed based on FUNC."
(let ((fval (symbol-function func)))
- (if (compiled-function-p fval)
+ (if (byte-code-function-p fval)
(list 'funcall fval)
(cons 'progn (cdr (cdr fval))))))
127 lisp/gnus.el
@@ -244,7 +244,7 @@ is restarted, and sometimes reloaded."
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.8"
+(defconst gnus-version-number "0.9"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Quassia Gnus v%s" gnus-version-number)
@@ -640,17 +640,17 @@ be set in `.emacs' instead."
(defface gnus-splash-face
'((((class color)
(background dark))
- (:foreground "green"))
+ (:foreground "ForestGreen"))
(((class color)
(background light))
- (:foreground "green"))
+ (:foreground "ForestGreen"))
"Level 1 newsgroup face.")
(defun gnus-splash ()
- (switch-to-buffer gnus-group-buffer)
+ (switch-to-buffer (get-buffer-create gnus-group-buffer))
(let ((buffer-read-only nil))
(unless gnus-inhibit-startup-message
@@ -1697,7 +1697,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
gnus-async-prefetch-article gnus-async-prefetch-remove-group
("gnus-agent" gnus-open-agent gnus-agent-get-function
- gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p)
+ gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p
+ gnus-agent-get-undownloaded-list)
("gnus-agent" :interactive t
gnus-unplugged gnus-agentize)
("gnus-vm" :interactive t gnus-summary-save-in-vm
@@ -2014,6 +2015,122 @@ If ARG, insert string at point."
(setq gnus-info-buffer (current-buffer))
(gnus-configure-windows 'info)))
+;;; gnus-interactive
+(defvar gnus-current-prefix-symbol nil
+ "Current prefix symbol.")
+(defvar gnus-current-prefix-symbols nil
+ "List of current prefix symbols.")
+(defun gnus-interactive (string &optional params)
+ "Return a list that can be fed to `interactive'.
+See `interactive' for full documentation.
+Adds the following specs:
+y -- The current symbolic prefix.
+Y -- A list of the current symbolic prefix(es).
+A -- Article number.
+H -- Article header.
+g -- Group name."
+ (let ((i 0)
+ out c prompt)
+ (while (< i (length string))
+ (string-match ".\\([^\n]*\\)\n?" string i)
+ (setq c (aref string i))
+ (when (match-end 1)
+ (setq prompt (match-string 1 string)))
+ (setq i (match-end 0))
+ ;; We basically emulate just about everything that
+ ;; `interactive' does, but adds the "g" and "G" specs.
+ (push
+ (cond
+ ((= c ?a)
+ (completing-read prompt obarray 'fboundp t))
+ ((= c ?b)
+ (read-buffer prompt (current-buffer) t))
+ ((= c ?B)
+ (read-buffer prompt (other-buffer (current-buffer))))
+ ((= c ?c)
+ (read-char))
+ ((= c ?C)
+ (completing-read prompt obarray 'commandp t))
+ ((= c ?d)
+ (point))
+ ((= c ?D)
+ (read-file-name prompt nil default-directory 'lambda))
+ ((= c ?f)
+ (read-file-name prompt nil nil 'lambda))
+ ((= c ?F)
+ (read-file-name prompt))
+ ((= c ?k)
+ (read-key-sequence prompt))
+ ((= c ?K)
+ (error "Not implemented spec"))
+ ((= c ?e)
+ (error "Not implemented spec"))
+ ((= c ?m)
+ (mark))
+ ((= c ?N)
+ (error "Not implemented spec"))
+ ((= c ?n)
+ (string-to-number (read-from-minibuffer prompt)))
+ ((= c ?p)
+ (prefix-numeric-value current-prefix-arg))
+ ((= c ?P)
+ current-prefix-arg)
+ ((= c ?r)
+ 'gnus-prefix-nil)
+ ((= c ?s)
+ (read-string prompt))
+ ((= c ?S)
+ (intern (read-string prompt)))
+ ((= c ?v)
+ (read-variable prompt))
+ ((= c ?x)
+ (read-minibuffer prompt))
+ ((= c ?x)
+ (eval-minibuffer prompt))
+ ;; And here the new specs come.
+ ((= c ?y)
+ gnus-current-prefix-symbol)
+ ((= c ?Y)
+ gnus-current-prefix-symbols)
+ ((= c ?g)
+ (gnus-group-group-name))
+ ((= c ?A)
+ (gnus-summary-article-number))
+ ((= c ?H)
+ (gnus-summary-article-header))
+ (t
+ (error "Not implemented spec")))
+ out)
+ (cond
+ ((= c ?r)
+ (push (if (< (point) (mark) (point) (mark))) out)
+ (push (if (> (point) (mark) (point) (mark))) out))))
+ (setq out (delq 'gnus-prefix-nil out))
+ (nreverse out)))
+(defun gnus-symbolic-argument (&optional arg)
+ "Read a symbolic argument and a command, and then execute command."
+ (interactive "P")
+ (let* ((in-command (this-command-keys))
+ (command in-command)
+ gnus-current-prefix-symbols
+ gnus-current-prefix-symbol
+ syms)
+ (while (equal in-command command)
+ (message "%s-" (key-description (this-command-keys)))
+ (push (intern (char-to-string (read-char))) syms)
+ (setq command (read-key-sequence nil t)))
+ (setq gnus-current-prefix-symbols (nreverse syms)
+ gnus-current-prefix-symbol (car gnus-current-prefix-symbols))
+ (call-interactively (key-binding command t))))
;;; More various functions.
(defsubst gnus-check-backend-function (func group)
37 lisp/message.el
@@ -902,7 +902,9 @@ The cdr of ech entry is a function for applying the face to a region.")
(autoload 'gnus-point-at-bol "gnus-util")
(autoload 'gnus-output-to-mail "gnus-util")
(autoload 'gnus-output-to-rmail "gnus-util")
- (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev"))
+ (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev")
+ (autoload 'nndraft-request-associate-buffer "nndraft")
+ (autoload 'nndraft-request-expire-articles "nndraft"))
@@ -1003,7 +1005,7 @@ The cdr of ech entry is a function for applying the face to a region.")
"Return non-nil if FORM is funcallable."
(or (and (symbolp form) (fboundp form))
(and (listp form) (eq (car form) 'lambda))
- (compiled-function-p form)))
+ (byte-code-function-p form)))
(defun message-strip-subject-re (subject)
"Remove \"Re:\" from subject lines."
@@ -3036,37 +3038,14 @@ Headers already prepared in the buffer are not modified."
(defun message-set-auto-save-file-name ()
"Associate the message buffer with a file in the drafts directory."
(when message-autosave-directory
- (cond
- ((fboundp 'nndraft-request-associate-buffer)
- (setq message-draft-article (nndraft-request-associate-buffer "drafts"))
- (clear-visited-file-modtime))
- (t (unless (file-exists-p message-autosave-directory)
- (make-directory message-autosave-directory t))
- (let ((name (make-temp-name
- (expand-file-name
- (concat (file-name-as-directory
- message-autosave-directory)
- "msg."
- (message-replace-chars-in-string
- (message-replace-chars-in-string
- (buffer-name) ?* ?.)
- ?/ ?-))))))
- (setq buffer-auto-save-file-name
- (save-excursion
- (prog1
- (progn
- (set-buffer (get-buffer-create " *draft tmp*"))
- (setq buffer-file-name name)
- (make-auto-save-file-name))
- (kill-buffer (current-buffer)))))
- (clear-visited-file-modtime))))))
+ (setq message-draft-article (nndraft-request-associate-buffer "drafts"))
+ (clear-visited-file-modtime)))
(defun message-disassociate-draft ()
"Disassociate the message buffer from the drafts directory."
(when message-draft-article
- (if (fboundp 'nndraft-request-expire-articles)
- (nndraft-request-expire-articles
- (list message-draft-article) "drafts" nil t))))
+ (nndraft-request-expire-articles
+ (list message-draft-article) "drafts" nil t)))
4 lisp/nndraft.el
@@ -241,7 +241,9 @@
- nnmh-request-newsgroups))
+ nnmh-request-newsgroups
+ nnmh-request-move-article
+ nnmh-request-replace-article))
(provide 'nndraft)
1  lisp/nneething.el
@@ -64,6 +64,7 @@ If this variable is nil, no files will be excluded.")
(defvoo nneething-map nil)
(defvoo nneething-read-only nil)
(defvoo nneething-active nil)
+(defvoo nneething-directory nil)
11 lisp/nntp.el
@@ -79,6 +79,10 @@ the NNTP server available there (see nntp-rlogin-parameters) and
`nntp-open-telnet' which telnets to a remote system, logs in and does
the same.")
+(defvoo nntp-rlogin-program "rsh"
+ "*Program used to log in on remote machines.
+The default is \"rsh\", but \"ssh\" is a popular alternative.")
(defvoo nntp-rlogin-parameters '("telnet" "-8" "${NNTPSERVER:=news}" "nntp")
"*Parameters to `nntp-open-login'.
That function may be used as `nntp-open-connection-function'. In that
@@ -371,7 +375,8 @@ server there that you can connect to. See also `nntp-open-connection-function'"
(received 0)
(last-point (point-min))
(buf (nntp-find-connection-buffer nntp-server-buffer))
- (nntp-inhibit-erase t))
+ (nntp-inhibit-erase t)
+ article)
;; Send HEAD commands.
(while (setq article (pop articles))
@@ -1087,12 +1092,12 @@ This function is supposed to be called from `nntp-server-opened-hook'."
"Open a connection to SERVER using rsh."
(let ((proc (if nntp-rlogin-user-name
- "nntpd" buffer "rsh"
+ "nntpd" buffer nntp-rlogin-program
nntp-address "-l" nntp-rlogin-user-name
(mapconcat 'identity
nntp-rlogin-parameters " "))
- "nntpd" buffer "rsh" nntp-address
+ "nntpd" buffer nntp-rlogin-program nntp-address
(mapconcat 'identity
nntp-rlogin-parameters " ")))))
(set-buffer buffer)
9 lisp/nnvirtual.el
@@ -342,6 +342,15 @@ to virtual article number.")
"Return the real group and article for virtual GROUP and ARTICLE."
(nnvirtual-map-article article))
+(deffoo nnvirtual-request-post (&optional server)
+ (if (not gnus-message-group-art)
+ (nnheader-report 'nnvirtual "Can't post to an nnvirtual group")
+ (let ((group (car (nnvirtual-find-group-art
+ (car gnus-message-group-art)
+ (cdr gnus-message-group-art)))))
+ (gnus-request-post (gnus-find-method-for-group group)))))
;;; Internal functions.
2  lisp/pop3.el
@@ -271,7 +271,7 @@ Return the response string if optional second argument is non-nil."
"*Program to encode its input in MD5.")
(defun pop3-md5 (string)
- (with-temp-buffer
+ (nnheader-temp-write nil
(insert string)
(call-process-region (point-min) (point-max)
(or shell-file-name "/bin/sh")
8 texi/ChangeLog
@@ -1,3 +1,11 @@
+Sun Sep 21 04:35:56 1997 Lars Magne Ingebrigtsen <>
+ * gnus.texi (NNTP): Addition.
+ (Hiding Headers): Addition.
+ (Symbolic Prefixes): New.
+ (Extended Interactive): New.
+ (Summary Score Commands): Addition.
Sat Sep 20 20:53:43 1997 Lars Magne Ingebrigtsen <>
* gnus.texi (Startup Variables): Addition.
14 texi/Makefile
@@ -8,19 +8,13 @@ DVIPS=dvips
-all: gnus message custom widget
+all: gnus message
most: texi2latex.elc latex latexps
gnus: gnus.texi
$(MAKEINFO) -eval '(find-file "gnus.texi")' $(XINFOSWI)
-custom: custom.texi
- $(MAKEINFO) -eval '(find-file "custom.texi")' $(XINFOSWI)
-widget: widget.texi
- $(MAKEINFO) -eval '(find-file "widget.texi")' $(XINFOSWI)
message: message.texi
$(MAKEINFO) -eval '(find-file "message.texi")' $(XINFOSWI)
@@ -51,8 +45,6 @@ clean:
makeinfo -o gnus gnus.texi
makeinfo -o message message.texi
- makeinfo -o widget widget.texi
- makeinfo -o custom custom.texi
texi2latex.elc: texi2latex.el
$(EMACS) -batch -l bytecomp -f batch-byte-recompile-directory
@@ -117,11 +109,9 @@ veryclean:
make clean
rm -f *.orig *.rej *.elc *~ gnus gnus-[0-9] gnus-[0-9][0-9]
- rm -f message message-[0-9] widget custom
+ rm -f message message-[0-9]
cp gnus gnus-[0-9] gnus-[0-9][0-9] $(INFODIR)
cp message $(INFODIR)
- cp widget $(INFODIR)
- cp custom $(INFODIR)
695 texi/custom.texi
@@ -1,695 +0,0 @@
-\input texinfo.tex
-@c %**start of header
-@setfilename custom
-@settitle The Customization Library
-@headings double
-@end iftex
-@c %**end of header
-@node Top, Introduction, (dir), (dir)
-@comment node-name, next, previous, up
-@top The Customization Library
-Version: 1.82
-* Introduction::
-* User Commands::
-* The Customization Buffer::
-* Declarations::
-* Utilities::
-* The Init File::
-* Wishlist::
-@end menu
-@node Introduction, User Commands, Top, Top
-@comment node-name, next, previous, up
-@section Introduction
-This library allows customization of @dfn{user options}. Currently two
-types of user options are supported, namely @dfn{variables} and
-@dfn{faces}. Each user option can have four different values
-@table @dfn
-@item factory setting
-The value specified by the programmer.
-@item saved value
-The value saved by the user as the default for this variable. This
-overwrites the factory setting when starting a new emacs.
-@item current value
-The value used by Emacs. This will not be remembered next time you
-run Emacs.
-@item widget value
-The value entered by the user in a customization buffer, but not yet
-@end table
-Variables also have a @dfn{type}, which specifies what kind of values
-the variable can hold, and how the value is presented in a customization
-buffer. By default a variable can hold any valid expression, but the
-programmer can specify a more limited type when declaring the variable.
-The user options are organized in a number of @dfn{groups}. Each group
-can contain a number user options, as well as other groups. The groups
-allows the user to concentrate on a specific part of emacs.
-@node User Commands, The Customization Buffer, Introduction, Top
-@comment node-name, next, previous, up
-@section User Commands
-The following commands will create a customization buffer:
-@table @code
-@item customize
-Create a customization buffer containing a specific group, by default
-the @code{emacs} group.
-@item customize-variable
-Create a customization buffer containing a single variable.
-@item customize-face
-Create a customization buffer containing a single face.
-@item customize-apropos
-Create a customization buffer containing all variables, faces, and
-groups that match a user specified regular expression.
-@end table
-@node The Customization Buffer, Declarations, User Commands, Top
-@comment node-name, next, previous, up
-@section The Customization Buffer.
-The customization buffer allows the user to make temporary or permanent
-changes to how specific aspects of emacs works, by setting and editing
-user options.
-The customization buffer contains three types of text:
-@table @dfn
-@item informative text
-where the normal editing commands are disabled.
-@item editable fields
-where you can edit with the usual emacs commands. Editable fields are
-usually displayed with a grey background if your terminal supports
-colors, or an italic font otherwise.
-@item buttons
-which can be activated by either pressing the @kbd{@key{ret}} while
-point is located on the text, or pushing @kbd{mouse-2} while the mouse
-pointer is above the tex. Buttons are usually displayed in a bold
-@end table
-You can move to the next the next editable field or button by pressing
-@kbd{@key{tab}} or the previous with @kbd{M-@key{tab}}. Some buttons
-have a small helpful message about their purpose, which will be
-displayed when you move to it with the @key{tab} key.
-The buffer is divided into three part, an introductory text, a list of
-customization options, and a line of customization buttons. Each part
-will be described in the following.
-* The Introductory Text::
-* The Customization Options::
-* The Variable Options::
-* The Face Options::
-* The Group Options::
-* The State Button::
-* The Customization Buttons::
-@end menu
-@node The Introductory Text, The Customization Options, The Customization Buffer, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Introductory Text
-The start of the buffer contains a short explanation of what it is, and
-how to get help. It will typically look like this:
-This is a customization buffer.
-Push RET or click mouse-2 on the word _help_ for more information.
-@end example
-Rather boring. It is mostly just informative text, but the word
-@samp{help} is a button that will bring up this document when
-@node The Customization Options, The Variable Options, The Introductory Text, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Customization Options
-Each customization option looks similar to the following text:
- *** custom-background-mode: default
- State: this item is unchanged from its factory setting.
- [ ] [?] The brightness of the background.
-@end example
-The option contains the parts described below.
-@table @samp
-@item ***
-The Level Button. The customization options in the buffer are organized
-in a hierarchy, which is indicated by the number of stars in the level
-button. The top level options will be shown as @samp{*}. When they are
-expanded, the suboptions will be shown as @samp{**}. The example option
-is thus a subsuboption.
-Activating the level buttons will toggle between hiding and exposing the
-content of that option. The content can either be the value of the
-option, as in this example, or a list of suboptions.
-@item custom-background-mode
-This is the tag of the the option. The tag is a name of a variable, a
-face, or customization group. Activating the tag has an effect that
-depends on the exact type of the option. In this particular case,
-activating the tag will bring up a menu that will allow you to choose
-from the three possible values of the `custom-background-mode'
-@item default
-After the tag, the options value is shown. Depending on its type, you
-may be able to edit the value directly. If an option should contain a
-file name, it is displayed in an editable field, i.e. you can edit it
-using the standard emacs editing commands.
-@item State: this item is unchanged from its factory setting.
-The state line. This line will explain the state of the option,
-e.g. whether it is currently hidden, or whether it has been modified or
-not. Activating the button will allow you to change the state, e.g. set
-or reset the changes you have made. This is explained in detail in the
-following sections.
-@item [ ]
-The magic button. This is an abbreviated version of the state line.
-@item [?]
-The documentation button. If the documentation is more than one line,
-this button will be present. Activating the button will toggle whether
-the complete documentation is shown, or only the first line.
-@item The brightness of the background.
-This is a documentation string explaining the purpose of this particular
-customization option.
-@end table
-@node The Variable Options, The Face Options, The Customization Options, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Variable Options
-The most common customization options are emacs lisp variables. The
-actual editing of these variables depend on what type values the
-variable is expected to contain. For example, a lisp variable whose
-value should be a string will typically be represented with an editable
-text field in the buffer, where you can change the string directly. If
-the value is a list, each item in the list will be presented in the
-buffer buffer on a separate line, with buttons to insert new items in
-the list, or delete existing items from the list. You may want to see
-@ref{User Interface,,, widget, The Widget Library}, where some examples
-of editing are discussed.
-You can either choose to edit the value directly, or edit the lisp
-value for that variable. The lisp value is a lisp expression that
-will be evaluated when you start emacs. The result of the evaluation
-will be used as the initial value for that variable. Editing the
-lisp value is for experts only, but if the current value of the
-variable is of a wrong type (i.e. a symbol where a string is expected),
-the `edit lisp' mode will always be selected.
-You can see what mode is currently selected by looking at the state
-button. If it uses parenthesises (like @samp{( )}) it is in edit lisp
-mode, with square brackets (like @samp{[ ]}) it is normal edit mode.
-You can switch mode by activating the state button, and select either
-@samp{Edit} or @samp{Edit lisp} from the menu.
-You can change the state of the variable with the other menu items:
-@table @samp
-@item Set
-When you have made your modifications in the buffer, you need to
-activate this item to make the modifications take effect. The
-modifications will be forgotten next time you run emacs.
-@item Save
-Unless you activate this item instead! This will mark the modification
-as permanent, i.e. the changes will be remembered in the next emacs
-@item Reset
-If you have made some modifications and not yet applied them, you can
-undo the modification by activating this item.
-@item Reset to Saved
-Activating this item will reset the value of the variable to the last
-value you marked as permanent with `Save'.
-@item Reset to Factory Settings
-Activating this item will undo all modifications you have made, and
-reset the value to the initial value specified by the program itself.
-@end table
-By default, the value of large or complicated variables are hidden. You
-can show the value by clicking on the level button.
-@node The Face Options, The Group Options, The Variable Options, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Face Options
-A face is an object that controls the appearance of some buffer text.
-The face has a number of possible attributes, such as boldness,
-foreground color, and more. For each attribute you can specify whether
-this attribute is controlled by the face, and if so, what the value is.
-For example, if the attribute bold is not controlled by a face, using
-that face on some buffer text will not affect its boldness. If the bold
-attribute is controlled by the face, it can be turned either on or of.
-It is possible to specify that a face should have different attributes
-on different device types. For example, a face may make text red on a
-color device, and bold on a monochrome device. You do this by
-activating `Edit All' in the state menu.
-The way this is presented in the customization buffer is to have a list
-of display specifications, and for each display specification a list of
-face attributes. For each face attribute, there is a checkbox
-specifying whether this attribute has effect and what the value is.
-Here is an example:
- *** custom-invalid-face: (sample)
- State: this item is unchanged from its factory setting.
- [ ] Face used when the customize item is invalid.
- [INS] [DEL] Display: [ ] Type: [ ] X [ ] PM [ ] Win32 [ ] DOS [ ] TTY
- [X] Class: [X] Color [ ] Grayscale [ ] Monochrome
- [ ] Background: [ ] Light [ ] Dark
- Attributes: [ ] Bold: off
- [ ] Italic: off
- [ ] Underline: off
- [X] Foreground: yellow (sample)
- [X] Background: red (sample)
- [ ] Stipple:
- [INS] [DEL] Display: all
- Attributes: [X] Bold: on
- [X] Italic: on
- [X] Underline: on
- [ ] Foreground: default (sample)
- [ ] Background: default (sample)
- [ ] Stipple:
- [INS]
-@end example
-This has two display specifications. The first will match all color
-displays, independently on what window system the device belongs to, and
-whether background color is dark or light. For devices matching this
-specification, @samp{custom-invalid-face} will force text to be
-displayed in yellow on red, but leave all other attributes alone.
-The second display will simply match everything. Since the list is
-prioritised, this means that it will match all non-color displays. For
-these, the face will not affect the foreground or background color, but
-force the font to be both bold, italic, and underline.
-You can add or delete display specifications by activating the
-@samp{[INS]} and @samp{[DEL]} buttons, and modify them by clicking on
-the check boxes. The first checkbox in each line in the display
-specification is special. It specify whether this particular property
-will even be relevant. By not checking the box in the first display, we
-match all device types, also device types other than those listed.
-After modifying the face, you can activate the state button to make the
-changes take effect. The menu items in the state button menu is similar
-to the state menu items for variables described in the previous section.
-@node The Group Options, The State Button, The Face Options, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Group Options
-Since Emacs has approximately a zillion configuration options, they have
-been organized in groups. Each group can contain other groups, thus
-creating a customization hierarchy. The nesting of the customization
-within the visible part of this hierarchy is indicated by the number of
-stars in the level button.
-Since there is really no customization needed for the group itself, the
-menu items in the groups state button will affect all modified group
-members recursively. Thus, if you activate the @samp{Set} menu item,
-all variables and faces that have been modified and belong to that group
-will be applied. For those members that themselves are groups, it will
-work as if you had activated the @samp{Set} menu item on them as well.
-@node The State Button, The Customization Buttons, The Group Options, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The State Line and The Magic Button
-The state line has two purposes. The first is to hold the state menu,
-as described in the previous sections. The second is to indicate the
-state of each customization item.
-For the magic button, this is done by the character inside the brackets.
-The following states have been defined, the first that applies to the
-current item will be used:
-@table @samp
-@item -
-The option is currently hidden. For group options that means the
-members are not shown, for variables and faces that the value is not
-shown. You cannot perform any of the state change operations on a
-hidden customization option.
-@item *
-The value if this option has been modified in the buffer, but not yet
-@item +
-The item has has been set by the user.
-@item :
-The current value of this option is different from the saved value.
-@item !
-The saved value of this option is different from the factory setting.
-@item @@
-The factory setting of this option is not known. This occurs when you
-try to customize variables or faces that have not been explicitly
-declared as customizable.
-@item SPC
-The factory setting is still in effect.
-@end table
-For non-hidden group options, the state shown is the most severe state
-of its members, where more severe means that it appears earlier in the
-list above (except hidden members, which are ignored).
-@node The Customization Buttons, , The State Button, The Customization Buffer
-@comment node-name, next, previous, up
-@subsection The Customization Buttons
-The last part of the customization buffer looks like this:
-[Set] [Save] [Reset] [Done]
-@end example
-Activating the @samp{[Set]}, @samp{[Save]}, or @samp{[Reset]}
-button will affect all modified customization items that are visible in
-the buffer. @samp{[Done]} will bury the buffer.
-@node Declarations, Utilities, The Customization Buffer, Top
-@comment node-name, next, previous, up
-@section Declarations
-This section describes how to declare customization groups, variables,
-and faces. It doesn't contain any examples, but please look at the file
-@file{cus-edit.el} which contains many declarations you can learn from.
-* Declaring Groups::
-* Declaring Variables::
-* Declaring Faces::
-* Usage for Package Authors::
-@end menu
-All the customization declarations can be changes by keyword arguments.
-Groups, variables, and faces all share these common keywords:
-@table @code
-@item :group
-@var{value} should be a customization group.
-Add @var{symbol} to that group.
-@item :link
-@var{value} should be a widget type.
-Add @var{value} to the extrenal links for this customization option.
-Useful widget types include @code{custom-manual}, @code{info-link}, and
-@item :load
-Add @var{value} to the files that should be loaded nefore displaying
-this customization option. The value should be iether a string, which
-should be a string which will be loaded with @code{load-library} unless
-present in @code{load-history}, or a symbol which will be loaded with
-@item :tag
-@var{Value} should be a short string used for identifying the option in
-customization menus and buffers. By default the tag will be
-automatically created from the options name.
-@end table
-@node Declaring Groups, Declaring Variables, Declarations, Declarations
-@comment node-name, next, previous, up
-@subsection Declaring Groups
-Use @code{defgroup} to declare new customization groups.
-@defun defgroup symbol members doc [keyword value]...
-Declare @var{symbol} as a customization group containing @var{members}.
-@var{symbol} does not need to be quoted.
-@var{doc} is the group documentation.
-@var{members} should be an alist of the form ((@var{name}
-@var{widget})...) where @var{name} is a symbol and @var{widget} is a
-widget for editing that symbol. Useful widgets are
-@code{custom-variable} for editing variables, @code{custom-face} for
-editing faces, and @code{custom-group} for editing groups.@refill
-Internally, custom uses the symbol property @code{custom-group} to keep
-track of the group members, and @code{group-documentation} for the
-documentation string.
-The following additional @var{keyword}'s are defined:
-@table @code
-@item :prefix
-@var{value} should be a string. If the string is a prefix for the name
-of a member of the group, that prefix will be ignored when creating a
-tag for that member.
-@end table
-@end defun
-@node Declaring Variables, Declaring Faces, Declaring Groups, Declarations
-@comment node-name, next, previous, up
-@subsection Declaring Variables
-Use @code{defcustom} to declare user editable variables.
-@defun defcustom symbol value doc [keyword value]...
-Declare @var{symbol} as a customizable variable that defaults to @var{value}.
-Neither @var{symbol} nor @var{value} needs to be quoted.
-If @var{symbol} is not already bound, initialize it to @var{value}.
-@var{doc} is the variable documentation.
-The following additional @var{keyword}'s are defined:
-@table @code
-@item :type
-@var{value} should be a widget type.
-@item :options
-@var{value} should be a list of possible members of the specified type.
-For hooks, this is a list of function names.
-@end table
-@xref{Sexp Types,,,widget,The Widget Library}, for information about
-widgets to use together with the @code{:type} keyword.
-@end defun
-Internally, custom uses the symbol property @code{custom-type} to keep
-track of the variables type, @code{factory-value} for the program
-specified default value, @code{saved-value} for a value saved by the
-user, and @code{variable-documentation} for the documentation string.
-Use @code{custom-add-option} to specify that a specific function is
-useful as an meber of a hook.
-@defun custom-add-option symbol option
-To the variable @var{symbol} add @var{option}.
-If @var{symbol} is a hook variable, @var{option} should be a hook
-member. For other types variables, the effect is undefined."
-@end defun
-@node Declaring Faces, Usage for Package Authors, Declaring Variables, Declarations
-@comment node-name, next, previous, up
-@subsection Declaring Faces
-Faces are declared with @code{defface}.
-@defun defface face spec doc [keyword value]...
-Declare @var{face} as a customizable face that defaults to @var{spec}.
-@var{face} does not need to be quoted.
-If @var{face} has been set with `custom-set-face', set the face attributes
-as specified by that function, otherwise set the face attributes
-according to @var{spec}.
-@var{doc} is the face documentation.
-@var{spec} should be an alist of the form @samp{((@var{display} @var{atts})...)}.
-@var{atts} is a list of face attributes and their values. The possible
-attributes are defined in the variable `custom-face-attributes'.
-Alternatively, @var{atts} can be a face in which case the attributes of
-that face is used.
-The @var{atts} of the first entry in @var{spec} where the @var{display}
-matches the frame should take effect in that frame. @var{display} can
-either be the symbol `t', which will match all frames, or an alist of
-the form @samp{((@var{req} @var{item}...)...)}@refill
-For the @var{display} to match a FRAME, the @var{req} property of the
-frame must match one of the @var{item}. The following @var{req} are
-@table @code
-@item type
-(the value of (window-system))@*
-Should be one of @code{x} or @code{tty}.
-@item class
-(the frame's color support)@*
-Should be one of @code{color}, @code{grayscale}, or @code{mono}.
-@item background
-(what color is used for the background text)@*
-Should be one of @code{light} or @code{dark}.
-@end table
-Internally, custom uses the symbol property @code{factory-face} for the
-program specified default face properties, @code{saved-face} for
-properties saved by the user, and @code{face-doc-string} for the
-documentation string.@refill
-@end defun
-@node Usage for Package Authors, , Declaring Faces, Declarations
-@comment node-name, next, previous, up
-@subsection Usage for Package Authors
-The recommended usage for the author of a typical emacs lisp package is
-to create one group identifying the package, and make all user options
-and faces members of that group. If the package has more than around 20
-such options, they should be divided into a number of subgroups, with
-each subgroup being member of the top level group.
-The top level group for the package should itself be member of one or
-more of the standard customization groups. There exists a group for
-each @emph{finder} keyword. Press @kbd{C-c p} to see a list of finder
-keywords, and add you group to each of them, using the @code{:group}
-@node Utilities, The Init File, Declarations, Top
-@comment node-name, next, previous, up
-@section Utilities
-These utilities can come in handy when adding customization support.
-@deffn Widget custom-manual
-Widget type for specifying the info manual entry for a customization
-option. It takes one argument, an info address.
-@end deffn
-@defun custom-add-to-group group member widget
-To existing @var{group} add a new @var{member} of type @var{widget},
-If there already is an entry for that member, overwrite it.
-@end defun
-@defun custom-add-link symbol widget
-To the custom option @var{symbol} add the link @var{widget}.
-@end defun
-@defun custom-add-load symbol load
-To the custom option @var{symbol} add the dependency @var{load}.
-@var{load} should be either a library file name, or a feature name.
-@end defun
-@defun custom-menu-create symbol &optional name
-Create menu for customization group @var{symbol}.
-If optional @var{name} is given, use that as the name of the menu.
-Otherwise make up a name from @var{symbol}.
-The menu is in a format applicable to @code{easy-menu-define}.
-@end defun
-@node The Init File, Wishlist, Utilities, Top
-@comment node-name, next, previous, up
-@section The Init File
-When you save the customizations, call to @code{custom-set-variables},
-@code{custom-set-faces} are inserted into the file specified by
-@code{custom-file}. By default @code{custom-file} is your @file{.emacs}
-file. If you use another file, you must explicitly load it yourself.
-The two functions will initialize variables and faces as you have
-@node Wishlist, , The Init File, Top
-@comment node-name, next, previous, up
-@section Wishlist
-@itemize @bullet
-The menu items should be grayed out when the information is
-missing. I.e. if a variable doesn't have a factory setting, the user
-should not be allowed to select the @samp{Factory} menu item.
-Better support for keyboard operations in the customize buffer.
-Integrate with @file{w3} so you can customization buffers with much
-better formatting. I'm thinking about adding a <custom>name</custom>
-tag. The latest w3 have some support for this, so come up with a
-convincing example.
-Add an `examples' section, with explained examples of custom type
-Support selectable color themes. I.e., change many faces by setting one
-Support undo using lmi's @file{gnus-undo.el}.
-Make it possible to append to `choice', `radio', and `set' options.
-Make it possible to customize code, for example to enable or disable a
-global minor mode.
-Ask whether set or modified variables should be saved in
-Ditto for @code{kill-emacs-query-functions}.
-Command to check if there are any customization options that
-does not belong to an existing group.
-Optionally disable the point-cursor and instead highlight the selected
-item in XEmacs. This is like the *Completions* buffer in XEmacs.
-Suggested by Jens Lautenbacher
-Empty customization groups should start open (harder than it looks).
-Make it possible to include a comment/remark/annotation when saving an
-@end itemize
143 texi/gnus.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Quassia Gnus 0.8 Manual
+@settitle Quassia Gnus 0.9 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@@ -309,7 +309,7 @@ into another language, under the above conditions for modified versions.
-@title Quassia Gnus 0.8 Manual
+@title Quassia Gnus 0.9 Manual
@author by Lars Magne Ingebrigtsen
@@ -345,7 +345,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
spool or your mbox file. All at the same time, if you want to push your
-This manual corresponds to Quassia Gnus 0.8.
+This manual corresponds to Quassia Gnus 0.9.
@end ifinfo
@@ -4627,6 +4627,32 @@ as 10, you might consider setting this variable to something sensible:
All words that match this regexp will be removed before comparing two
+@item gnus-simplify-subject-functions
+@vindex gnus-simplify-subject-functions
+If non-@code{nil}, this variable overrides
+@code{gnus-summary-gather-subject-limit}. This variable should be a
+list of functions to apply to the @code{Subject} string iteratively to
+arrive at the simplified version of the string.
+Useful functions to put in this list include:
+@table @code
+@item gnus-simplify-subject-re
+@findex gnus-simplify-subject-re
+Strip the leading @samp{Re:}.
+@item gnus-simplify-subject-fuzzy
+@findex gnus-simplify-subject-fuzzy
+Simplify fuzzily.
+@item gnus-simplify-whitespace
+@findex gnus-simplify-whitespace
+Remove excessive whitespace.
+@end table
+You may also write your own functions, of course.
@item gnus-summary-gather-exclude-subject
@vindex gnus-summary-gather-exclude-subject
Since loose thread gathering is done on subjects only, that might lead
@@ -7022,7 +7048,8 @@ which means that the current group select method will be used instead.
@kindex C-c C-c (Article)
Edit the current article (@code{gnus-summary-edit-article}). To finish
editing and make the changes permanent, type @kbd{C-c C-c}
+(@kbd{gnus-summary-edit-article-done}). If you give a prefix to the
+@kbd{C-c C-c} command, Gnus won't re-highlight the article.
@item B q
@kindex B q (Summary)
@@ -7610,7 +7637,9 @@ Remove the @code{Reply-To} header if it lists the same address as the
@code{From} header.
@item date
Remove the @code{Date} header if the article is less than three days
+@item long-to
+Remove the @code{To} header if it is very long.
@end table
To include the four first elements, you could say something like;
@@ -8798,6 +8827,11 @@ to the remote system and then another @samp{telnet} to get to the
@table @code
+@item nntp-rlogin-program
+@vindex nntp-rlogin-program
+Program used to log in on remote machines. The default is @samp{rsh},
+but @samp{ssh} is a popular alternative.
@item nntp-rlogin-parameters
@vindex nntp-rlogin-parameters
This list will be used as the parameter list given to @code{rsh}.
@@ -11534,6 +11568,9 @@ The keystrokes for actually making score entries follow a very regular
pattern, so there's no need to list all the commands. (Hundreds of
+@findex gnus-summary-increase-score
+@findex gnus-summary-lower-score
The first key is either @kbd{I} (upper case i) for increasing the score
@@ -11653,6 +11690,12 @@ defaults for the remaining one or two keystrokes. The defaults are
``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s
t}, and @kbd{I a R} is the same as @kbd{I a r t}.
+These functions take both the numerical prefix and the symbolic prefix
+(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower
+(or increase) the score of the article. A symbolic prefix of @code{a}
+says to use the @file{all.SCORE} file for the command instead of the
+current score file.
@vindex gnus-score-mimic-keymap
The @code{gnus-score-mimic-keymap} says whether these commands will
pretend they are keymaps or not.
@@ -13078,6 +13121,7 @@ four days, Gnus will decay the scores four times, for instance.
* Process/Prefix:: A convention used by many treatment commands.
* Interactive:: Making Gnus ask you many questions.
+* Symbolic Prefixes:: How to supply some Gnus functions with options.
* Formatting Variables:: You can specify what buffers should look like.
* Windows Configuration:: Configuring the Gnus buffer windows.
* Compilation:: How to speed Gnus up.
@@ -13173,6 +13217,41 @@ default.
@end table
+@node Symbolic Prefixes
+@section Symbolic Prefixes
+@cindex symbolic prefixes
+Quite a lot of Emacs commands react to the (numeric) prefix. For
+instance, @kbd{C-u 4 C-f} moves point four charaters forward, and
+@kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
+rule of 900 to the current article.
+This is all nice and well, but what if you want to give a command some
+additional information? Well, what most commands do is interpret the
+``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that one
+doesn't want a backup file to be created when saving the current buffer,
+for instance. But what if you want to save without making a backup
+file, and you want Emacs to flash lights and play a nice tune at the
+same time? You can't, and you're probably perfectly happy that way.
+@kindex M-i (Summary)
+@findex gnus-symbolic-argument
+I'm not, so I've added a second prefix---the @dfn{symbolic prefix}. The
+prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
+character typed in is the value. You can stack as many @kbd{M-i}
+prefixes as you want. @kbd{M-i a M-C-u} means ``feed the @kbd{M-C-u}
+command the symbolic prefix @code{a}''. @kbd{M-i a M-i b M-C-u} means
+``feed the @kbd{M-C-u} command the symbolic prefixes @code{a} and
+@code{b}''. You get the drift.
+Typing in symbolic prefixes to commands that don't accept them doesn't
+hurt, but it doesn't do any good either. Currently not many Gnus
+functions make use of the symbolic prefix.
+If you're interested in how Gnus implements this, @pxref{Extended
@node Formatting Variables
@section Formatting Variables
@cindex formatting variables
@@ -16165,6 +16244,7 @@ and general methods of operation.
* Headers:: How Gnus stores headers internally.
* Ranges:: A handy format for storing mucho numbers.
* Group Info:: The group info format.
+* Extended Interactive:: Symbolic prefixes and stuff.
* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen.
* Various File Formats:: Formats of files that Gnus use.
@end menu
@@ -17336,6 +17416,59 @@ is necessary, you can just pass on a non-@code{nil} third parameter to
the three final setter functions to have this happen automatically.
+@node Extended Interactive
+@subsection Extended Interactive
+@cindex interactive
+@findex gnus-interactive
+Gnus extends the standard Emacs @code{interactive} specification
+slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
+Prefixes}). Here's an example of how this is used:
+(defun gnus-summary-increase-score (&optional score symp)
+ (interactive (gnus-interactive "P\ny"))
+ ...
+ )
+@end lisp
+The best thing to do would have been to implement
+@code{gnus-interactive} as a macro which would have returned an
+@code{interactive} form, but this isn't possible since Emacs checks
+whether a function is interactive or not by simply doing an @code{assq}
+on the lambda form. So, instead we have @code{gnus-interactive}
+function that takes a string and returns values that are usable to
+This function accepts (almost) all normal @code{interactive} specs, but
+adds a few more.
+@table @samp
+@item y
+@vindex gnus-current-prefix-symbol
+The current symbolic prefix---the @code{gnus-current-prefix-symbol}
+@item Y
+@vindex gnus-current-prefix-symbols
+A list of the current symbolic prefixes---the
+@code{gnus-current-prefix-symbol} variable.
+@item A
+The current article number---the @code{gnus-summary-article-number}
+@item H
+The current article header---the @code{gnus-summary-article-header}
+@item g
+The current group name---the @code{gnus-group-group-name}
+@end table
@node Emacs/XEmacs Code
@subsection Emacs/XEmacs Code
@cindex XEmacs
6 texi/message.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename message
-@settitle Message 0.8 Manual
+@settitle Message 0.9 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@@ -39,7 +39,7 @@ into another language, under the above conditions for modified versions.
-@title Message 0.8 Manual
+@title Message 0.9 Manual
@author by Lars Magne Ingebrigtsen
@@ -79,7 +79,7 @@ buffers.
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message 0.8. Message is distributed with
+This manual corresponds to Message 0.9. Message is distributed with
the Gnus distribution bearing the same version number as this manual
1,432 texi/widget.texi
@@ -1,1432 +0,0 @@
-\input texinfo.tex
-@c %**start of header
-@setfilename widget
-@settitle The Emacs Widget Library
-@headings double
-@end iftex
-@c %**end of header
-@node Top, Introduction, (dir), (dir)
-@comment node-name, next, previous, up
-@top The Emacs Widget Library
-Version: 1.82
-* Introduction::
-* User Interface::
-* Programming Example::
-* Setting Up the Buffer::
-* Basic Types::
-* Sexp Types::
-* Widget Properties::
-* Defining New Widgets::
-* Widget Wishlist.::
-@end menu
-@node Introduction, User Interface, Top, Top
-@comment node-name, next, previous, up
-@section Introduction
-Most graphical user interface toolkits, such as Motif and XView, provide
-a number of standard user interface controls (sometimes known as
-`widgets' or `gadgets'). Emacs doesn't really support anything like
-this, except for an incredible powerful text ``widget''. On the other
-hand, Emacs does provide the necessary primitives to implement many
-other widgets within a text buffer. The @code{widget} package
-simplifies this task.
-The basic widgets are:
-@table @code
-@item link
-Areas of text with an associated action. Intended for hypertext links
-embedded in text.
-@item push-button
-Like link, but intended for stand-alone buttons.
-@item editable-field
-An editable text field. It can be either variable or fixed length.
-@item menu-choice
-Allows the user to choose one of multiple options from a menu, each
-option is itself a widget. Only the selected option will be visible in
-the buffer.
-@item radio-button-choice
-Allows the user to choose one of multiple options by pushing radio
-buttons. The options are implemented as widgets. All options will be
-visible in the buffer.
-@item item
-A simple constant widget intended to be used in the @code{menu-choice} and
-@code{radio-button-choice} widgets.
-@item choice-item
-An button item only intended for use in choices. When pushed, the user
-will be asked to select another option from the choice widget.
-@item toggle
-A simple @samp{on}/@samp{off} switch.
-@item checkbox
-A checkbox (@samp{[ ]}/@samp{[X]}).
-@item editable-list
-Create an editable list. The user can insert or delete items in the
-list. Each list item is itself a widget.
-@end table
-Now of what possible use can support for widgets be in a text editor?
-I'm glad you asked. The answer is that widgets are useful for
-implementing forms. A @dfn{form} in emacs is a buffer where the user is
-supposed to fill out a number of fields, each of which has a specific
-meaning. The user is not supposed to change or delete any of the text
-between the fields. Examples of forms in Emacs are the @file{forms}
-package (of course), the customize buffers, the mail and news compose
-modes, and the @sc{html} form support in the @file{w3} browser.
-The advantages for a programmer of using the @code{widget} package to
-implement forms are:
-More complex field than just editable text are supported.
-You can give the user immediate feedback if he enters invalid data in a
-text field, and sometimes prevent entering invalid data.
-You can have fixed sized fields, thus allowing multiple field to be
-lined up in columns.
-It is simple to query or set the value of a field.
-Editing happens in buffer, not in the mini-buffer.
-Packages using the library get a uniform look, making them easier for
-the user to learn.
-As support for embedded graphics improve, the widget library will
-extended to support it. This means that your code using the widget
-library will also use the new graphic features by automatic.
-@end enumerate
-In order to minimize the code that is loaded by users who does not
-create any widgets, the code has been split in two files:
-@table @file
-@item widget.el