*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:12:16 +0000 (23:12 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:12:16 +0000 (23:12 +0000)
13 files changed:
lisp/ChangeLog
lisp/custom-edit.el
lisp/custom.el
lisp/gnus-group.el
lisp/gnus-load.el
lisp/gnus-sum.el
lisp/gnus.el
lisp/nnmail.el
lisp/widget-edit.el
lisp/widget.el
texi/ChangeLog
texi/Makefile
texi/gnus.texi

index 50dd30a..db7bcfd 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 3fa5b03..afa677d 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; 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:
@@ -16,8 +16,8 @@
 (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
@@ -177,22 +184,6 @@ The list should be sorted most significant first."
           (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
@@ -203,7 +194,7 @@ The list should be sorted most significant first."
   :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
@@ -214,19 +205,14 @@ The list should be sorted most significant first."
   ;; 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)
@@ -234,34 +220,10 @@ The list should be sorted most significant first."
           (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."
@@ -286,13 +248,23 @@ The list should be sorted most significant first."
        (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
@@ -312,19 +284,16 @@ The list should be sorted most significant first."
         (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)
@@ -371,20 +340,23 @@ The list should be sorted most significant first."
 (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)
@@ -542,7 +514,7 @@ Optional EVENT is the location for the menu."
   :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
@@ -690,7 +662,7 @@ Optional EVENT is the location for the menu."
 (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
@@ -1001,7 +973,7 @@ OPTIONS should be an alist of the form ((SYMBOL WIDGET)...), where
 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.
index ce5dd5d..b7d1acd 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; 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:
@@ -238,22 +238,24 @@ If there already is an entry for that option, overwrite it."
 
 ;;; 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.
index 404b9ad..8d49f5a 100644 (file)
@@ -478,6 +478,7 @@ ticked: The number of ticked articles.")
     "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)
index 845c1d5..2c1b9c8 100644 (file)
@@ -466,7 +466,7 @@ less space and be faster as a result.")
   (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))
index 3918da5..7c7bf83 100644 (file)
@@ -2146,10 +2146,12 @@ This is all marks except unread, ticked, dormant, and expirable."
    (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))
@@ -4851,6 +4853,7 @@ If optional argument UNREAD is non-nil, only unread article is selected."
 (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.
index 7cb5aa7..b3a2476 100644 (file)
@@ -42,7 +42,7 @@
   "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)
index fa93388..0400581 100644 (file)
@@ -74,7 +74,7 @@ new mail into folder numbers that Gnus has marked as expired.")
 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
index 07d3db4..7eb78fc 100644 (file)
@@ -4,7 +4,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)
@@ -151,13 +165,32 @@ minibuffer."
 (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.
@@ -168,7 +201,9 @@ minibuffer."
                                       '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.
@@ -527,7 +562,10 @@ With optional ARG, move across that many fields."
                              ;; 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))
@@ -766,19 +804,21 @@ With optional ARG, move across that many fields."
        (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.
@@ -790,13 +830,15 @@ With optional ARG, move across that many 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)
@@ -832,6 +874,12 @@ With optional ARG, move across that many fields."
 
 (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)
 
@@ -1567,12 +1615,88 @@ With optional ARG, move across that many fields."
        (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"
@@ -1611,8 +1735,10 @@ It will read a directory name from the minibuffer when activated."
   :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.
@@ -1679,6 +1805,10 @@ It will read a directory name from the minibuffer when activated."
   :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"
@@ -1716,7 +1846,12 @@ It will read a directory name from the minibuffer when activated."
   "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"
index e5eadc8..6c3b1c3 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; 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:
@@ -26,7 +26,7 @@
             (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
@@ -36,7 +36,8 @@
   :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")
index 2031926..074e98b 100644 (file)
@@ -1,3 +1,8 @@
+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.
index b793883..803bbd7 100644 (file)
@@ -27,7 +27,8 @@ sclean:
        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 
@@ -80,3 +81,7 @@ out:
        /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
index cdb5b55..6913111 100644 (file)
@@ -1,7 +1,7 @@
 \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
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Red Gnus 0.40 Manual
+@title Red Gnus 0.41 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -738,7 +738,7 @@ don't like that, just set this variable to @code{nil}.
 
 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?  
@@ -812,7 +812,7 @@ Gnus.  But hey, who would want to, right?
 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
@@ -982,6 +982,7 @@ long as Gnus is active.
 * 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.
@@ -1115,21 +1116,23 @@ Indentation based on the level of the topic (@pxref{Group Topics}).
 @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
@@ -1305,10 +1308,10 @@ Select the current group, switch to the summary buffer and display the
 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)
@@ -1334,54 +1337,26 @@ 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
 
@@ -1464,7 +1439,7 @@ Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
 @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
@@ -1475,6 +1450,43 @@ 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
@@ -1575,7 +1587,7 @@ Alternatively, you can sort on score and then level.  (Taken together,
 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
@@ -1792,7 +1804,7 @@ Add the current group to an @code{nnvirtual} group
 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.
@@ -1906,7 +1918,7 @@ ticked articles.
 @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
@@ -1945,7 +1957,9 @@ These commands all list various slices of the groups that are available.
 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
@@ -2069,7 +2083,7 @@ Sort by number of unread articles.
 
 @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
@@ -2110,7 +2124,7 @@ Sort the group buffer by group score
 @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
@@ -2153,7 +2167,7 @@ Sort the process/prefixed groups in the group buffer by group score
 @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
@@ -2562,7 +2576,7 @@ Sort the current topic by group score
 @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
@@ -2796,8 +2810,10 @@ for fetching the file.
 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
@@ -2967,11 +2983,11 @@ Indentation based on thread level (@pxref{Customizing Threading}).
 @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.
@@ -3007,7 +3023,8 @@ The @code{Date} in @code{YYYYMMDDTHHMMSS} format.
 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
@@ -3057,7 +3074,7 @@ Number of unread articles in this group.
 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
@@ -3066,7 +3083,7 @@ shortened to @samp{r.a.anime}.
 @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
@@ -3147,14 +3164,14 @@ Go to the previous summary line of an unread article
 @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
@@ -3168,18 +3185,18 @@ Variables related to summary movement:
 
 @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
@@ -4372,7 +4389,7 @@ The default is @code{4}.
 @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.
@@ -4382,25 +4399,25 @@ 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
@@ -4411,13 +4428,13 @@ Toggle threading (@code{gnus-summary-toggle-threads}).
 @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)