+Mon Sep 23 19:10:20 1996 Lars Magne Ingebrigtsen <larsi@ylfing.ifi.uio.no>
+
+ * gnus-sum.el (gnus-summary-goto-subject): Made into command.
+
+Mon Sep 23 18:26:47 1996 Tonny Madsen <Tonny.Madsen@netman.dk>
+
+ * nnmail.el (nnmail-default-file-modes): Use integer.
+
+Sun Sep 22 12:58:57 1996 Lars Magne Ingebrigtsen <larsi@ylfing.ifi.uio.no>
+
+ * gnus.el: Red Gnus v0.40 is released.
+
Sun Sep 22 11:48:02 1996 Lars Magne Ingebrigtsen <larsi@hler.ifi.uio.no>
* custom.el (defcustom): Eval and compile.
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 0.94
+;; Version: 0.96
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
(require 'custom)
(require 'widget-edit)
-(define-widget-keywords :custom-show :custom-doc :custom-magic
- :custom-state :custom-documentation-property :custom-level :custom-form
+(define-widget-keywords :custom-show :custom-magic
+ :custom-state :custom-level :custom-form
:custom-apply :custom-set-default :custom-reset)
;;; Utilities.
;; widgets to be hidden.
(widget-put (get 'item 'widget-type) :custom-show t)
-(widget-put (get 'editable-field 'widget-type) :custom-show t)
+(widget-put (get 'editable-field 'widget-type)
+ :custom-show (lambda (widget value)
+ (let ((pp (pp-to-string value)))
+ (cond ((string-match "\n" pp)
+ nil)
+ ((> (length pp) 40)
+ nil)
+ (t t)))))
(widget-put (get 'menu-choice 'widget-type) :custom-show t)
;;; The `custom-magic' Widget
(widget-put parent :custom-state 'hidden)))
(custom-redraw parent)))
-;;; The `custom-help' Widget.
-
-(define-widget 'custom-help 'push-button
- "The custom documentation button."
- :format "%[[%t]%] %d"
- :help-echo "Push me to toggle the documentation."
- :action 'custom-help-action)
-
-(defun custom-help-action (widget &optional event)
- "Toggle documentation for WIDGET."
- (let ((old (widget-get widget :doc))
- (new (widget-get widget :custom-doc)))
- (widget-put widget :doc new)
- (widget-put widget :custom-doc old))
- (widget-value-set widget (widget-value widget)))
-
;;; The `custom' Widget.
(define-widget 'custom 'default
:notify 'custom-notify
:custom-level 1
:custom-state 'hidden
- :custom-documentation-property 'widget-subclass-responsibility
+ :documentation-property 'widget-subclass-responsibility
:value-create 'widget-subclass-responsibility
:value-delete 'widget-radio-value-delete
:value-get 'widget-item-value-get
;; We recognize extra escape sequences.
(let* ((symbol (widget-get widget :value))
(buttons (widget-get widget :buttons))
- (level (widget-get widget :custom-level))
- (doc-property (widget-get widget :custom-documentation-property))
- (doc-try (or (widget-get widget :doc)
- (documentation-property symbol doc-property)))
- (doc-text (and (stringp doc-try)
- (> (length doc-try) 1)
- doc-try)))
+ (level (widget-get widget :custom-level)))
(cond ((eq escape ?l)
(when level
(push (widget-create-child-and-convert
widget 'custom-level (make-string level ?*))
buttons)
- (widget-insert " ")))
+ (widget-insert " ")
+ (widget-put widget :buttons buttons)))
((eq escape ?m)
(and (eq (preceding-char) ?\n)
(widget-get widget :indent)
(let ((magic (widget-create-child-and-convert
widget 'custom-magic nil)))
(widget-put widget :custom-magic magic)
- (push magic buttons)))
- ((eq escape ?h)
- (when doc-text
- (and (eq (preceding-char) ?\n)
- (widget-get widget :indent)
- (insert-char ? (widget-get widget :indent)))
- ;; The `*' in the beginning is redundant.
- (when (eq (aref doc-text 0) ?*)
- (setq doc-text (substring doc-text 1)))
- ;; Get rid of trailing newlines.
- (when (string-match "\n+\\'" doc-text)
- (setq doc-text (substring doc-text 0 (match-beginning 0))))
- (push (if (string-match "\n." doc-text)
- ;; Allow multiline doc to be hiden.
- (widget-create-child-and-convert
- widget 'custom-help
- :doc (progn
- (string-match "\\`.*" doc-text)
- (match-string 0 doc-text))
- :custom-doc doc-text
- "?")
- ;; A single line is just inserted.
- (widget-create-child-and-convert
- widget 'item :format "%d" :doc doc-text nil))
- buttons)))
+ (push magic buttons)
+ (widget-put widget :buttons buttons)))
(t
- (widget-default-format-handler widget escape)))
- (widget-put widget :buttons buttons)))
+ (widget-help-format-handler widget escape)))))
(defun custom-notify (widget &rest args)
"Keep track of changes."
(custom-group-state-update widget))))
(widget-setup))
+(defun custom-show (widget value)
+ "Non-nil if WIDGET should be shown with VALUE by default."
+ (let ((show (widget-get widget :custom-show)))
+ (cond ((null show)
+ nil)
+ ((eq t show)
+ t)
+ (t
+ (funcall show widget value)))))
+
;;; The `custom-variable' Widget.
(define-widget 'custom-variable 'custom
"Customize variable."
:format "%l%v%m %h"
:help-echo "Push me to set or reset this variable."
- :custom-documentation-property 'variable-documentation
+ :documentation-property 'variable-documentation
:custom-state nil
:custom-form 'edit
:value-create 'custom-variable-value-create
(type (if (listp child-type)
child-type
(list child-type)))
- conv value)
+ (conv (widget-convert type))
+ (value (if (boundp symbol)
+ (symbol-value symbol)
+ (widget-get conv :value))))
;; If the widget is new, the child determine whether it is hidden.
(cond (state)
- ((widget-get type :custom-show)
+ ((custom-show type value)
(setq state 'unknown))
(t
(setq state 'hidden)))
- ;; If the widget is not hidden, we will need its value.
- (unless (eq state 'hidden)
- (setq conv (widget-convert type)
- value (if (boundp symbol)
- (symbol-value symbol)
- (widget-get conv :value))))
;; If we don't know the state, see if we need to edit it in lisp form.
(when (eq state 'unknown)
(unless (widget-apply (widget-convert type) :match value)
(defun custom-variable-state-set (widget)
"Set the state of WIDGET."
(let* ((symbol (widget-value widget))
- (value (symbol-value symbol)))
- (widget-put widget
- :custom-state (if (get symbol 'saved-value)
- (if (equal (custom-quote value)
- (car (get symbol 'saved-value)))
- 'saved
- 'applied)
- (if (get symbol 'factory-value)
- (if (equal (custom-quote value)
- (car (get symbol
- 'factory-value)))
- 'factory
- 'applied)
- 'rogue)))))
+ (value (symbol-value symbol))
+ (state (if (get symbol 'saved-value)
+ (if (condition-case nil
+ (equal value
+ (eval (car (get symbol 'saved-value))))
+ (error nil))
+ 'saved
+ 'applied)
+ (if (get symbol 'factory-value)
+ (if (condition-case nil
+ (equal value
+ (eval (car (get symbol 'factory-value))))
+ (error nil))
+ 'factory
+ 'applied)
+ 'rogue))))
+ (widget-put widget :custom-state state)))
(defvar custom-variable-menu
'(("Edit" . custom-variable-edit)
:format "%l%[%t%]: %s%m %h%v"
:format-handler 'custom-face-format-handler
:help-echo "Push me to set or reset this face."
- :custom-documentation-property 'face-documentation
+ :documentation-property 'face-documentation
:value-create 'custom-face-value-create
:action 'custom-face-action
:custom-apply 'custom-face-apply
(define-widget 'custom-group 'custom
"Customize group."
:format "%l%[%t%]:\n%m %h%v"
- :custom-documentation-property 'group-documentation
+ :documentation-property 'group-documentation
:help-echo "Push me to set or reset all members of this group."
:value-create 'custom-group-value-create
:action 'custom-group-action
SYMBOL is a customization option, and WIDGET is a widget for editing
that option."
(kill-buffer (get-buffer-create "*Customization*"))
- (switch-to-buffer-other-window (get-buffer-create "*Customization*"))
+ (switch-to-buffer (get-buffer-create "*Customization*"))
(custom-mode)
(widget-insert "This is a customization buffer.
Press `C-h m' for to get help.
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, faces
-;; Version: 0.94
+;; Version: 0.96
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
;;; Face Utilities.
-(make-face 'custom-face-empty)
+(and (fboundp 'make-face)
+ (make-face 'custom-face-empty))
(defun custom-face-display-set (face spec &optional frame)
"Set FACE to the attributes to the first matching entry in SPEC.
Iff optional FRAME is non-nil, set it for that frame only.
See `defface' for information about SPEC."
- (make-face face)
- (copy-face 'custom-face-empty face)
- (while spec
- (let* ((entry (car spec))
- (display (nth 0 entry))
- (atts (nth 1 entry)))
- (setq spec (cdr spec))
- (when (custom-display-match-frame display frame)
- (apply 'custom-face-attribites-set face frame atts)
- (setq spec nil)))))
+ (when (fboundp 'make-face)
+ (make-face face)
+ (copy-face 'custom-face-empty face)
+ (while spec
+ (let* ((entry (car spec))
+ (display (nth 0 entry))
+ (atts (nth 1 entry)))
+ (setq spec (cdr spec))
+ (when (custom-display-match-frame display frame)
+ (apply 'custom-face-attribites-set face frame atts)
+ (setq spec nil))))))
(defcustom custom-background-mode nil
"The brightness of the background.
"f" gnus-score-flush-cache)
(gnus-define-keys (gnus-group-help-map "H" gnus-group-mode-map)
+ "d" gnus-group-describe-group
"f" gnus-group-fetch-faq)
(gnus-define-keys (gnus-group-sub-map "S" gnus-group-mode-map)
(condition-case ()
(if (gnus-visual-p 'mouse-face 'highlight)
(if (boundp 'gnus-mouse-face)
- gnus-mouse-face
+ (or gnus-mouse-face 'highlight)
'highlight)
'default)
(error nil))
(point) (progn (eval gnus-summary-dummy-line-format-spec) (point))
(list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number)))
-(defun gnus-summary-insert-line
- (gnus-tmp-header gnus-tmp-level gnus-tmp-current gnus-tmp-unread
- gnus-tmp-replied gnus-tmp-expirable gnus-tmp-subject-or-nil
- &optional gnus-tmp-dummy gnus-tmp-score gnus-tmp-process)
+(defun gnus-summary-insert-line (gnus-tmp-header
+ gnus-tmp-level gnus-tmp-current
+ gnus-tmp-unread gnus-tmp-replied
+ gnus-tmp-expirable gnus-tmp-subject-or-nil
+ &optional gnus-tmp-dummy gnus-tmp-score
+ gnus-tmp-process)
(let* ((gnus-tmp-indentation (aref gnus-thread-indent-array gnus-tmp-level))
(gnus-tmp-lines (mail-header-lines gnus-tmp-header))
(gnus-tmp-score (or gnus-tmp-score gnus-summary-default-score 0))
(defun gnus-summary-goto-subject (article &optional force silent)
"Go the subject line of ARTICLE.
If FORCE, also allow jumping to articles not currently shown."
+ (interactive "nArticle number: ")
(let ((b (point))
(data (gnus-data-find article)))
;; We read in the article if we have to.
"Score and kill file handling."
:group 'gnus )
-(defconst gnus-version-number "0.40"
+(defconst gnus-version-number "0.41"
"Version number for this version of Gnus.")
(defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
If nil, groups like \"mail.misc\" will end up in directories like
\"mail/misc/\".")
-(defvar nnmail-default-file-modes ?\600
+(defvar nnmail-default-file-modes 384
"Set the mode bits of all new mail files to this integer.")
(defvar nnmail-expiry-wait 7
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: extensions
-;; Version: 0.94
+;; Version: 0.96
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
;;; Code:
(require 'widget)
-(require 'custom)
(require 'cl)
(autoload 'pp-to-string "pp")
+;; The following should go away when bundled with Emacs.
+(require 'custom)
+(eval-and-compile
+ (unless (fboundp 'custom-declare-variable)
+ ;; We have the old custom-library, hack around it!
+ (defmacro defgroup (&rest args) nil)
+ (defmacro defcustom (&rest args) nil)
+ (defmacro defface (&rest args) nil)
+ (when (fboundp 'copy-face)
+ (copy-face 'default 'widget-documentation-face)
+ (copy-face 'bold 'widget-button-face)
+ (copy-face 'italic 'widget-field-face))
+ (defvar widget-mouse-face 'highlight)
+ (defvar widget-menu-max-size 40)))
+
;;; Compatibility.
(or (fboundp 'event-point)
(defun widget-specify-field (widget from to)
;; Specify editable button for WIDGET between FROM and TO.
(widget-specify-field-update widget from to)
- ;; Make it possible to edit both end of the field.
- (put-text-property (- from 2) from 'intangible t)
+
+ ;; Make it possible to edit the front end of the field.
(add-text-properties (1- from) from (list 'rear-nonsticky t
'end-open t
'invisible t))
+ (when (or (string-match ".%v" (widget-get widget :format))
+ (widget-get widget :hide-front-space))
+ ;; WARNING: This is going to lose horrible if the character just
+ ;; before the field can be modified (e.g. if it belongs to a
+ ;; choice widget). We try to compensate by checking the format
+ ;; string, and hope the user hasn't changed the :create method.
+ (put-text-property (- from 2) from 'intangible 'front))
+
+ ;; Make it possible to edit back end of the field.
(add-text-properties to (1+ to) (list 'front-sticky nil
- 'start-open t)))
+ 'start-open t))
+
+ (when (widget-get widget :size)
+ (put-text-property to (1+ to) 'invisible t)
+ (when (or (string-match "%v." (widget-get widget :format))
+ (widget-get widget :hide-rear-space))
+ ;; WARNING: This is going to lose horrible if the character just
+ ;; after the field can be modified (e.g. if it belongs to a
+ ;; choice widget). We try to compensate by checking the format
+ ;; string, and hope the user hasn't changed the :create method.
+ (put-text-property to (+ to 2) 'intangible 'rear))))
(defun widget-specify-field-update (widget from to)
;; Specify editable button for WIDGET between FROM and TO.
'read-only nil
'keymap map
'local-map map
- 'face face))))
+ 'face face))
+ (unless (widget-get widget :size)
+ (put-text-property to (1+ to) 'face face))))
(defun widget-specify-button (widget from to)
;; Specify button for WIDGET between FROM and TO.
;; Field too small.
(save-excursion
(goto-char end)
- (insert-char ?\ (- (+ begin size) end))))
+ (insert-char ?\ (- (+ begin size) end))
+ (widget-specify-field-update field
+ begin
+ (+ begin size))))
((> (- end begin) size)
;; Field too large and
(if (or (< (point) (+ begin size))
(value (widget-get widget :value))
(from (point)))
(if (null size)
- (insert value " ")
+ (if (zerop (length value))
+ (insert "")
+ (insert value))
(insert value)
(if (< (length value) size)
(insert-char ?\ (- size (length value)))))
(unless (memq widget widget-field-list)
(setq widget-field-new (cons widget widget-field-new)))
- (widget-put widget :value-from (copy-marker from))
- (set-marker-insertion-type (widget-get widget :value-from) t)
(widget-put widget :value-to (copy-marker (point)))
(set-marker-insertion-type (widget-get widget :value-to) nil)
(if (null size)
(insert ?\n)
- (insert ?\ ))))
+ (insert ?\ ))
+ (widget-put widget :value-from (copy-marker from))
+ (set-marker-insertion-type (widget-get widget :value-from) t)))
(defun widget-field-value-delete (widget)
;; Remove the widget from the list of active editing fields.
;; Return current text in editing field.
(let ((from (widget-get widget :value-from))
(to (widget-get widget :value-to))
+ (size (widget-get widget :size))
(old (current-buffer)))
(if (and from to)
(progn
(set-buffer (marker-buffer from))
(setq from (1+ from)
to (1- to))
- (while (and (> to from)
+ (while (and size
+ (> to from)
(eq (char-after (1- to)) ?\ ))
(setq to (1- to)))
(prog1 (buffer-substring-no-properties from to)
(defun widget-choice-convert-widget (widget)
;; Expand type args into widget objects.
+; (widget-put widget :args (mapcar (lambda (child)
+; (if (widget-get child ':converted)
+; child
+; (widget-put child ':converted t)
+; (widget-convert child)))
+; (widget-get widget :args)))
(widget-put widget :args (mapcar 'widget-convert (widget-get widget :args)))
widget)
(cons found vals)
nil)))
+;;; The `widget-help' Widget.
+
+(define-widget 'widget-help 'push-button
+ "The widget documentation button."
+ :format "%[[%t]%] %d"
+ :help-echo "Push me to toggle the documentation."
+ :action 'widget-help-action)
+
+(defun widget-help-action (widget &optional event)
+ "Toggle documentation for WIDGET."
+ (let ((old (widget-get widget :doc))
+ (new (widget-get widget :widget-doc)))
+ (widget-put widget :doc new)
+ (widget-put widget :widget-doc old))
+ (widget-value-set widget (widget-value widget)))
+
+(defun widget-help-format-handler (widget escape)
+ ;; We recognize extra escape sequences.
+ (let* ((symbol (widget-get widget :value))
+ (buttons (widget-get widget :buttons))
+ (doc-property (widget-get widget :documentation-property))
+ (doc-try (cond ((widget-get widget :doc))
+ ((symbolp doc-property)
+ (documentation-property symbol doc-property))
+ (t
+ (funcall doc-property symbol))))
+ (doc-text (and (stringp doc-try)
+ (> (length doc-try) 1)
+ doc-try)))
+ (cond ((eq escape ?h)
+ (when doc-text
+ (and (eq (preceding-char) ?\n)
+ (widget-get widget :indent)
+ (insert-char ? (widget-get widget :indent)))
+ ;; The `*' in the beginning is redundant.
+ (when (eq (aref doc-text 0) ?*)
+ (setq doc-text (substring doc-text 1)))
+ ;; Get rid of trailing newlines.
+ (when (string-match "\n+\\'" doc-text)
+ (setq doc-text (substring doc-text 0 (match-beginning 0))))
+ (push (if (string-match "\n." doc-text)
+ ;; Allow multiline doc to be hiden.
+ (widget-create-child-and-convert
+ widget 'widget-help
+ :doc (progn
+ (string-match "\\`.*" doc-text)
+ (match-string 0 doc-text))
+ :widget-doc doc-text
+ "?")
+ ;; A single line is just inserted.
+ (widget-create-child-and-convert
+ widget 'item :format "%d" :doc doc-text nil))
+ buttons)))
+ (t
+ (widget-default-format-handler widget escape)))
+ (widget-put widget :buttons buttons)))
+
;;; The Sexp Widgets.
(define-widget 'const 'item
"An immutable sexp."
:format "%t\n")
+(define-widget 'function-item 'item
+ "An immutable function name."
+ :format "%v\n%h"
+ :format-handler 'widget-help-format-handler
+ :documentation-property (lambda (symbol)
+ (condition-case nil
+ (documentation symbol t)
+ (error nil)))
+ :value-delete 'widget-radio-value-delete
+ :match (lambda (widget value) (symbolp value)))
+
+(define-widget 'variable-item 'item
+ "An immutable variable name."
+ :format "%v\n%h"
+ :format-handler 'widget-help-format-handler
+ :documentation-property 'variable-documentation
+ :value-delete 'widget-radio-value-delete
+ :match (lambda (widget value) (symbolp value)))
+
(define-widget 'string 'editable-field
"A string"
:tag "String"
:value nil
:tag "Symbol"
:match (lambda (widget value) (symbolp value))
- :value-to-internal (lambda (widget value) (symbol-name value))
- :value-to-external (lambda (widget value) (intern value)))
+ :value-to-internal (lambda (widget value) (and (symbolp value)
+ (symbol-name value)))
+ :value-to-external (lambda (widget value) (and (stringp value)
+ (intern value))))
(define-widget 'function 'symbol
;; Should complete on functions.
:type-error "This field should contain a number"
:match (lambda (widget value) (numberp value)))
+(define-widget 'hook 'sexp
+ "A emacs lisp hook"
+ :tag "Hook")
+
(define-widget 'list 'group
"A lisp list."
:tag "List"
"A union of several sexp types."
:tag "Choice"
:format "%[%t%]: %v")
-
+
+(define-widget 'radio 'radio-button-choice
+ "A union of several sexp types."
+ :tag "Choice"
+ :format "%t:\n%v")
+
(define-widget 'repeat 'editable-list
"A variable length homogeneous list."
:tag "Repeat"
;;
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: help, extensions, faces, hypermedia
-;; Version: 0.94
+;; Version: 0.96
;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
;;; Commentary:
(set (car keywords) (car keywords)))
(setq keywords (cdr keywords))))))
-(define-widget-keywords
+(define-widget-keywords :widget-doc
:create :convert-widget :format :value-create :offset :extra-offset
:tag :doc :from :to :args :value :value-from :value-to :action
:value-set :value-delete :match :parent :delete :menu-tag-get
:indent :size :value-to-external :validate :error :directory
:must-match :type-error :value-inline :inline :match-inline :greedy
:button-face-get :button-face :value-face :keymap :entry-from
- :entry-to :help-echo)
+ :entry-to :help-echo :documentation-property :hide-front-space
+ :hide-rear-space)
;; These autoloads should be deleted when the file is added to Emacs.
(autoload 'widget-create "widget-edit")
+Mon Sep 23 18:25:38 1996 Lars Magne Ingebrigtsen <larsi@ylfing.ifi.uio.no>
+
+ * gnus.texi (Thread Commands): Correction.
+ (Group Information): Correction.
+
Sat Sep 21 08:11:43 1996 Lars Magne Ingebrigtsen <lars@eyesore.no>
* gnus.texi (New Groups): Split into three nodes.
rm -f gnus.*.bak gnus.ky gnus.cp gnus.fn gnus.cps gnus.kys *.log \
gnus.log gnus.pg gnus.tp gnus.vr gnus.toc *.aux gnus.[cgk]idx \
gnus.ilg gnus.ind gnus.[cgk]ind gnus.idx \
- gnus.tmptexi gnus.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej
+ gnus.tmptexi gnus.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \
+ gnus.latexi*~*
clean:
make sclean
/local/ftp/pub/emacs/gnus/manual
mv gnus-manual-standard.ps.gz gnus-manual-a4.ps.gz \
/hom/larsi/www_docs/gnus/manual
+
+veryclean:
+ make clean
+ rm -f gnus.dvi gnus.ps
\input texinfo @c -*-texinfo-*-
@setfilename gnus
-@settitle Red Gnus 0.40 Manual
+@settitle Red Gnus 0.41 Manual
@synindex fn cp
@synindex vr cp
@synindex pg cp
@tex
@titlepage
-@title Red Gnus 0.40 Manual
+@title Red Gnus 0.41 Manual
@author by Lars Magne Ingebrigtsen
@page
Sometimes it is necessary to move from one @sc{nntp} server to another.
This happens very rarely, but perhaps you change jobs, or one server is
-very flakey and you want to use another.
+very flaky and you want to use another.
Changing the server is pretty easy, right? You just change
@code{gnus-select-method} to point to the new server?
If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
will not save the list of killed groups to the startup file. This will
save both time (when starting and quitting) and space (on disk). It
-will also means that Gnus has no record of what groups are new or old,
+will also mean that Gnus has no record of what groups are new or old,
so the automatic new groups subscription methods become meaningless.
You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
@code{ask-server} if you set this variable to @code{nil} (@pxref{New
* Group Buffer Format:: Information listed and how you can change it.
* Group Maneuvering:: Commands for moving in the group buffer.
* Selecting a Group:: Actually reading news.
+* Group Data:: Changing the info for a group.
* Subscription Commands:: Unsubscribing, killing, subscribing.
* Group Levels:: Levels? What are those, then?
* Group Score:: A mechanism for finding out what groups you like.
@vindex gnus-group-uncollapsed-levels
Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels}
variable says how many levels to leave at the end of the group name.
-The default is @code{1}.
+The default is @code{1}---this will mean that group names like
+@samp{gnu.emacs.gnus} will be shortened to @samp{g.emacs.gnus}.
@item u
User defined specifier. The next character in the format string should
be a letter. @sc{gnus} will call the function
@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
-following @samp{%u}. The function will be passed the current headers as
-argument. The function should return a string, which will be inserted
-into the buffer just like information from any other specifier.
+following @samp{%u}. The function will be passed a single dummy
+paratere as argument. The function should return a string, which will
+be inserted into the buffer just like information from any other
+specifier.
@end table
@cindex *
All the ``number-of'' specs will be filled with an asterisk (@samp{*})
if no info is available---for instance, if it is a non-activated foreign
-group, or a bogus (or semi-bogus) native group.
+group, or a bogus native group.
@node Group Modeline Specification
first unread article (@code{gnus-group-read-group}). If there are no
unread articles in the group, or if you give a non-numerical prefix to
this command, Gnus will offer to fetch all the old articles in this
-group from the server. If you give a numerical prefix @var{N}, Gnus
-will fetch @var{N} number of articles. If @var{N} is positive, fetch
-the @var{N} newest articles, if @var{N} is negative, fetch the
-@var{abs(N)} oldest articles.
+group from the server. If you give a numerical prefix @var{N}, @var{N}
+determines the number of articles Gnus will fetch. If @var{N} is
+positive, Gnus fetches the @var{N} newest articles, if @var{N} is
+negative, Gnus fetches the @var{abs(N)} oldest articles.
@item RET
@kindex RET (Group)
@item M-SPACE
@kindex M-SPACE (Group)
@findex gnus-group-visible-select-group
-This is yet one more command that does the same as the one above, but
-this one does it without expunging and hiding dormants
-(@code{gnus-group-visible-select-group}).
-
-@item c
-@kindex c (Group)
-@findex gnus-group-catchup-current
-@vindex gnus-group-catchup-group-hook
-Mark all unticked articles in this group as read
-(@code{gnus-group-catchup-current}).
-@code{gnus-group-catchup-group-hook} is called when catching up a group from
-the group buffer.
-
-@item C
-@kindex C (Group)
-@findex gnus-group-catchup-current-all
-Mark all articles in this group, even the ticked ones, as read
-(@code{gnus-group-catchup-current-all}).
-
-@item M-c
-@kindex M-c (Group)
-@findex gnus-group-clear-data
-Clear the data from the current group---nix out marks and the list of
-read articles (@code{gnus-group-clear-data}).
-
-@item M-x gnus-group-clear-data-on-native-groups
-@kindex M-x gnus-group-clear-data-on-native-groups
-@findex gnus-group-clear-data-on-native-groups
-If you have switched from one @sc{nntp} server to another, all your marks
-and read ranges have become worthless. You can use this command to
-clear out all data that you have on your native groups. Use with
-caution.
+This is yet one more command that does the same as the @kbd{RET}
+command, but this one does it without expunging and hiding dormants
+(@code{gnus-group-visible-select-group}).
@end table
@vindex gnus-large-newsgroup
The @code{gnus-large-newsgroup} variable says what Gnus should consider
-to be a big group. This is @code{200} by default. If the group has more
-unread articles than this, Gnus will query the user before entering the
-group. The user can then specify how many articles should be fetched
-from the server. If the user specifies a negative number (@code{-n}),
-the @code{n} oldest articles will be fetched. If it is positive, the
-@code{n} articles that have arrived most recently will be fetched.
+to be a big group. This is @code{200} by default. If the group has
+more (unread and/or ticked) articles than this, Gnus will query the user
+before entering the group. The user can then specify how many articles
+should be fetched from the server. If the user specifies a negative
+number (@code{-n}), the @code{n} oldest articles will be fetched. If it
+is positive, the @code{n} articles that have arrived most recently will
+be fetched.
@vindex gnus-select-group-hook
@vindex gnus-auto-select-first
@code{gnus-auto-select-first} control whether any articles are selected
-automatically when entering a group.
+automatically when entering a group with the @kbd{SPACE} command.
@table @code
@findex gnus-group-kill-level
Kill all groups on a certain level (@code{gnus-group-kill-level}).
These groups can't be yanked back after killing, so this command should
-be used with some caution. The only thing where this command comes in
+be used with some caution. The only time where this command comes in
really handy is when you have a @file{.newsrc} with lots of unsubscribed
groups that you want to get rid off. @kbd{S C-k} on level @code{7} will
kill off all unsubscribed groups that do not have message numbers in the
Also @pxref{Group Levels}.
+@node Group Data
+@section Group Data
+
+@table @kbd
+
+@item c
+@kindex c (Group)
+@findex gnus-group-catchup-current
+@vindex gnus-group-catchup-group-hook
+Mark all unticked articles in this group as read
+(@code{gnus-group-catchup-current}).
+@code{gnus-group-catchup-group-hook} is called when catching up a group from
+the group buffer.
+
+@item C
+@kindex C (Group)
+@findex gnus-group-catchup-current-all
+Mark all articles in this group, even the ticked ones, as read
+(@code{gnus-group-catchup-current-all}).
+
+@item M-c
+@kindex M-c (Group)
+@findex gnus-group-clear-data
+Clear the data from the current group---nix out marks and the list of
+read articles (@code{gnus-group-clear-data}).
+
+@item M-x gnus-group-clear-data-on-native-groups
+@kindex M-x gnus-group-clear-data-on-native-groups
+@findex gnus-group-clear-data-on-native-groups
+If you have switched from one @sc{nntp} server to another, all your marks
+and read ranges have become worthless. You can use this command to
+clear out all data that you have on your native groups. Use with
+caution.
+
+@end table
+
+
@node Group Levels
@section Group Levels
@cindex group level
the level and the score is called the @dfn{rank} of the group. A group
that is on level @code{4} and has a score of @code{1} has a higher rank than a group
on level @code{5} that has a score of @code{300}. (The level is the most significant
-part and the score is the least significant part.)
+part and the score is the least significant part.))
@findex gnus-summary-bubble-group
If you want groups you read often to get higher scores than groups you
methods.
@vindex gnus-activate-foreign-newsgroups
-If the @code{gnus-activate-foreign-newsgroups} is a positive number,
+If @code{gnus-activate-foreign-newsgroups} is a positive number,
Gnus will check all foreign groups with this level or lower at startup.
This might take quite a while, especially if you subscribe to lots of
groups from different @sc{nntp} servers.
@end table
@item comment
-This parameter allows you to enter a arbitrary comment on the group.
+This parameter allows you to enter an arbitrary comment on the group.
@item @var{(variable form)}
You can use the group parameters to set variables local to the group you
List all groups that have unread articles
(@code{gnus-group-list-groups}). If the numeric prefix is used, this
command will list only groups of level ARG and lower. By default, it
-only lists groups of level five or lower (i.e., just subscribed groups).
+only lists groups of level five (i. e.,
+@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
+groups).
@item L
@itemx A u
@item gnus-group-sort-by-method
@findex gnus-group-sort-by-method
-Sort by alphabetically on the select method.
+Sort alphabetically on the select method.
@end table
@item G S r
@kindex G S r (Group)
@findex gnus-group-sort-groups-by-rank
-Sort the group buffer by group level
+Sort the group buffer by group rank
(@code{gnus-group-sort-groups-by-rank}).
@item G S m
@item G P r
@kindex G P r (Group)
@findex gnus-group-sort-selected-groups-by-rank
-Sort the process/prefixed groups in the group buffer by group level
+Sort the process/prefixed groups in the group buffer by group rank
(@code{gnus-group-sort-selected-groups-by-rank}).
@item G P m
@item T S r
@kindex T S r (Topic)
@findex gnus-topic-sort-groups-by-rank
-Sort the current topic by group level
+Sort the current topic by group rank
(@code{gnus-topic-sort-groups-by-rank}).
@item T S m
If fetching from the first site is unsuccessful, Gnus will attempt to go
through @code{gnus-group-faq-directory} and try to open them one by one.
-@item D
-@kindex D (Group)
+@item H d
+@itemx C-c C-d
+@kindex H d (Group)
+@kindex C-c C-d (Group)
@cindex describing groups
@cindex group description
@findex gnus-group-describe-group
@item T
Nothing if the article is a root and lots of spaces if it isn't (it
pushes everything after it off the screen).
-@item \[
-Opening bracket, which is normally @samp{\[}, but can also be @samp{<}
+@item [
+Opening bracket, which is normally @samp{[}, but can also be @samp{<}
for adopted articles (@pxref{Customizing Threading}).
-@item \]
-Closing bracket, which is normally @samp{\]}, but can also be @samp{>}
+@item ]
+Closing bracket, which is normally @samp{]}, but can also be @samp{>}
for adopted articles.
@item >
One space for each thread level.
Number of articles in the current sub-thread. Using this spec will slow
down summary buffer generation somewhat.
@item e
-A single character will be displayed if the article has any children.
+An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
+article has any children.
@item P
The line number.
@item u
Number of unselected articles in this group.
@item Z
A string with the number of unread and unselected articles represented
-either as @samp{<%U(+%u) more>} if there are both unread and unselected
+either as @samp{<%U(+%e) more>} if there are both unread and unselected
articles, and just as @samp{<%U more>} if there are just unread articles
and no unselected ones.
@item g
@item S
Subject of the current article.
@item u
-Used-defined spec.
+User-defined spec.
@item s
Name of the current score file.
@item d
@kindex j (Summary)
@kindex G j (Summary)
@findex gnus-summary-goto-article
-Ask for an article number and then go that article
+Ask for an article number and then go to that article
(@code{gnus-summary-goto-article}).
@item G g
@kindex G g (Summary)
@findex gnus-summary-goto-subject
Ask for an article number and then go the summary line of that article
-(@code{gnus-summary-goto-subject}).
+without displaying the article (@code{gnus-summary-goto-subject}).
@end table
If Gnus asks you to press a key to confirm going to the next group, you
@vindex gnus-auto-select-next
@item gnus-auto-select-next
-If you are at the end of the group and issue one of the movement
-commands, Gnus will offer to go to the next group. If this variable is
-@code{t} and the next group is empty, Gnus will exit summary mode and
-return to the group buffer. If this variable is neither @code{t} nor
-@code{nil}, Gnus will select the next group, no matter whether it has
-any unread articles or not. As a special case, if this variable is
-@code{quietly}, Gnus will select the next group without asking for
-confirmation. If this variable is @code{almost-quietly}, the same will
-happen only if you are located on the last article in the group.
-Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
-command will go to the next group without confirmation. Also
-@pxref{Group Levels}.
+If you issue one of the movement commands (like @kbd{n}) and there are
+no more unread articles after the current one, Gnus will offer to go to
+the next group. If this variable is @code{t} and the next group is
+empty, Gnus will exit summary mode and return to the group buffer. If
+this variable is neither @code{t} nor @code{nil}, Gnus will select the
+next group, no matter whether it has any unread articles or not. As a
+special case, if this variable is @code{quietly}, Gnus will select the
+next group without asking for confirmation. If this variable is
+@code{almost-quietly}, the same will happen only if you are located on
+the last article in the group. Finally, if this variable is
+@code{slightly-quietly}, the @kbd{Z n} command will go to the next group
+without confirmation. Also @pxref{Group Levels}.
@item gnus-auto-select-same
@vindex gnus-auto-select-same
@kindex T k (Summary)
@kindex M-C-k (Summary)
@findex gnus-summary-kill-thread
-Mark all articles in the current sub-thread as read
+Mark all articles in the current (sub-)thread as read
(@code{gnus-summary-kill-thread}). If the prefix argument is positive,
remove all marks instead. If the prefix argument is negative, tick
articles instead.
@kindex T l (Summary)
@kindex M-C-l (Summary)
@findex gnus-summary-lower-thread
-Lower the score of the current thread
+Lower the score of the current (sub-)thread
(@code{gnus-summary-lower-thread}).
@item T i
@kindex T i (Summary)
@findex gnus-summary-raise-thread
-Increase the score of the current thread
+Increase the score of the current (sub-)thread
(@code{gnus-summary-raise-thread}).
@item T #
@kindex T # (Summary)
@findex gnus-uu-mark-thread
-Set the process mark on the current thread
+Set the process mark on the current (sub-)thread
(@code{gnus-uu-mark-thread}).
@item T M-#
@kindex T M-# (Summary)
@findex gnus-uu-unmark-thread
-Remove the process mark from the current thread
+Remove the process mark from the current (sub-)thread
(@code{gnus-uu-unmark-thread}).
@item T T
@item T s
@kindex T s (Summary)
@findex gnus-summary-show-thread
-Expose the thread hidden under the current article, if any
+Expose the (sub-)thread hidden under the current article, if any
(@code{gnus-summary-show-thread}).
@item T h
@kindex T h (Summary)
@findex gnus-summary-hide-thread
-Hide the current (sub)thread (@code{gnus-summary-hide-thread}).
+Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
@item T S
@kindex T S (Summary)