]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new user option to Gnus to allow `#' to toggle
authorAlex Bochannek <alex@bochannek.com>
Wed, 2 Jun 2021 05:41:25 +0000 (07:41 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 2 Jun 2021 05:41:25 +0000 (07:41 +0200)
* doc/misc/gnus.texi (Marking Groups, Setting Process Marks):
Mention the new variable.

* lisp/gnus/gnus-group.el (gnus-group-make-menu-bar): Update menu.
(gnus-group-mark-group): Support the variable.
(gnus-group-mark-update): New command.
(gnus-group-unmark-group, gnus-group-mark-region): Pass in new
parameter.

* lisp/gnus/gnus-sum.el (gnus-summary-make-menu-bar): Update menu.
(gnus-summary-mark-as-processable): Use the variable.

* lisp/gnus/gnus-topic.el (gnus-topic-mark-topic):  (bug#48683).

* lisp/gnus/gnus-topic.el (gnus-topic-mark-topic): Use the variable.

* lisp/gnus/gnus.el (gnus-process-mark-toggle): New user option.

doc/misc/gnus.texi
etc/NEWS
lisp/gnus/gnus-group.el
lisp/gnus/gnus-sum.el
lisp/gnus/gnus-topic.el
lisp/gnus/gnus.el

index 7d6fa4cb5cad8f93f8ec0a552cf51118e8a33fb2..11bcfc16aefcd4ace76bd8d1899ff92e684cff3c 100644 (file)
@@ -2583,7 +2583,9 @@ with the process mark and then execute the command.
 @itemx M m
 @kindex M m @r{(Group)}
 @findex gnus-group-mark-group
-Set the mark on the current group (@code{gnus-group-mark-group}).
+Set the mark on the current group (@code{gnus-group-mark-group}).@*
+If @code{gnus-process-mark-toggle} is non-@code{nil}, toggle the
+existing process mark for the current group.
 
 @item M-#
 @kindex M-# @r{(Group)}
@@ -4043,7 +4045,9 @@ Toggle hiding empty topics
 @findex gnus-topic-mark-topic
 Mark all groups in the current topic with the process mark
 (@code{gnus-topic-mark-topic}).  This command works recursively on
-sub-topics unless given a prefix.
+sub-topics unless given a prefix.@*
+If @code{gnus-process-mark-toggle} is non-@code{nil}, toggle the
+existing process mark for the current topic.
 
 @item T M-#
 @kindex T M-# @r{(Topic)}
@@ -6618,13 +6622,15 @@ articles into the cache.  For more information,
 @kindex M P p @r{(Summary)}
 @findex gnus-summary-mark-as-processable
 Mark the current article with the process mark
-(@code{gnus-summary-mark-as-processable}).
-@findex gnus-summary-unmark-as-processable
+(@code{gnus-summary-mark-as-processable}).@*
+If @code{gnus-process-mark-toggle} is non-@code{nil}, toggle the
+existing process mark for the current article.
 
 @item M P u
 @itemx M-#
 @kindex M P u @r{(Summary)}
 @kindex M-# @r{(Summary)}
+@findex gnus-summary-unmark-as-processable
 Remove the process mark, if any, from the current article
 (@code{gnus-summary-unmark-as-processable}).
 
@@ -10568,7 +10574,9 @@ Pick the article or thread on the current line
 entire thread when used at the first article of the thread.  Otherwise,
 it selects just the article.  If given a numerical prefix, go to that
 thread or article and pick it.  (The line number is normally displayed
-at the beginning of the summary pick lines.)
+at the beginning of the summary pick lines.)  If
+@code{gnus-process-mark-toggle} is non-@code{nil}, this key will
+unpick an already picked article.
 
 @item @key{SPC}
 @kindex SPC @r{(Pick)}
index d0f903ffa67c2adf38fa376b19801b96a8aedaa0..3658f7fcd53446eaec963ecbac0b641154aad95c 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -835,6 +835,11 @@ tags to be considered as well.
 
 ** Gnus
 
++++
+*** New user option 'gnus-process-mark-toggle'.
+If non-nil, the `#' command in the Group and Summary buffers will
+toggle instead of setting the process mark.
+
 +++
 *** New user option 'gnus-registry-register-all'.
 If non-nil (the default), create registry entries for all messages.
index 8c62c9424de867066c2fac7ad1c656fcf0aa9a3f..06d1313d3793d1a5f5d2de017fcc0d5cf4ddadb3 100644 (file)
@@ -894,14 +894,14 @@ simple manner."
        ["Sort by real name" gnus-group-sort-selected-groups-by-real-name
         (not (gnus-topic-mode-p))])
        ("Mark"
-       ["Mark group" gnus-group-mark-group
+       ["Set/Toggle mark" gnus-group-mark-group
         (and (gnus-group-group-name)
              (not (memq (gnus-group-group-name) gnus-group-marked)))]
-       ["Unmark group" gnus-group-unmark-group
+       ["Remove mark" gnus-group-unmark-group
         (and (gnus-group-group-name)
              (memq (gnus-group-group-name) gnus-group-marked))]
-       ["Unmark all" gnus-group-unmark-all-groups gnus-group-marked]
-       ["Mark regexp..." gnus-group-mark-regexp t]
+       ["Remove all marks" gnus-group-unmark-all-groups gnus-group-marked]
+       ["Mark by regexp..." gnus-group-mark-regexp t]
        ["Mark region" gnus-group-mark-region :active mark-active]
        ["Mark buffer" gnus-group-mark-buffer t]
        ["Execute command" gnus-group-universal-argument
@@ -1865,7 +1865,7 @@ If FIRST-TOO, the current line is also eligible as a target."
     (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2))
     (eq (char-after) gnus-process-mark)))
 
-(defun gnus-group-mark-group (n &optional unmark no-advance)
+(defun gnus-group-mark-group (n &optional unmark no-advance no-toggle)
   "Mark the current group."
   (interactive "p" gnus-group-mode)
   (let ((buffer-read-only nil)
@@ -1877,23 +1877,33 @@ If FIRST-TOO, the current line is also eligible as a target."
        (beginning-of-line)
        (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2))
        (delete-char 1)
-       (if unmark
-           (progn
-             (setq gnus-group-marked (delete group gnus-group-marked))
-              (insert-char ?\s 1 t))
-          (setq gnus-group-marked
-                (cons group (delete group gnus-group-marked)))
-          (insert-char gnus-process-mark 1 t)))
+       (if (and gnus-process-mark-toggle (not no-toggle))
+           (if (memq group gnus-group-marked)
+               (gnus-group-mark-update group t)
+             (gnus-group-mark-update group))
+         (gnus-group-mark-update group unmark)))
       (unless no-advance
        (gnus-group-next-group 1))
       (cl-decf n))
     (gnus-group-position-point)
     n))
 
+(defun gnus-group-mark-update (n &optional unmark)
+  "Set the process mark on current group and update the group line."
+  (if unmark
+      (progn
+       (setq gnus-group-marked
+             (delete n gnus-group-marked))
+       (insert-char ?\s 1 t))
+    (progn
+      (setq gnus-group-marked
+           (cons n (delete n gnus-group-marked)))
+      (insert-char gnus-process-mark 1 t))))
+
 (defun gnus-group-unmark-group (n)
   "Remove the mark from the current group."
   (interactive "p" gnus-group-mode)
-  (gnus-group-mark-group n 'unmark)
+  (gnus-group-mark-group n 'unmark nil t)
   (gnus-group-position-point))
 
 (defun gnus-group-unmark-all-groups ()
@@ -1910,7 +1920,7 @@ If UNMARK, remove the mark instead."
   (let ((num (count-lines beg end)))
     (save-excursion
       (goto-char beg)
-      (- num (gnus-group-mark-group num unmark)))))
+      (- num (gnus-group-mark-group num unmark nil t)))))
 
 (defun gnus-group-mark-buffer (&optional unmark)
   "Mark all groups in the buffer.
@@ -1935,7 +1945,7 @@ If UNMARK, remove the mark instead."
 Return nil if the group isn't displayed."
   (if (gnus-group-goto-group group nil test-marked)
       (save-excursion
-       (gnus-group-mark-group 1 'unmark t)
+       (gnus-group-mark-group 1 'unmark t t)
        t)
     (setq gnus-group-marked
          (delete group gnus-group-marked))
@@ -1945,7 +1955,7 @@ Return nil if the group isn't displayed."
   "Set the process mark on GROUP."
   (if (gnus-group-goto-group group)
       (save-excursion
-       (gnus-group-mark-group 1 nil t))
+       (gnus-group-mark-group 1 nil t t))
     (setq gnus-group-marked (cons group (delete group gnus-group-marked)))))
 
 (defun gnus-group-universal-argument (arg &optional _groups func)
index aa4c7532878333fe1da391cef8fcf4a2c3c093df..48794ceb3feefb52177e18543d7352caca970a1e 100644 (file)
@@ -2774,7 +2774,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Hide marked" gnus-summary-limit-exclude-marks t]
         ["Show expunged" gnus-summary-limit-include-expunged t])
        ("Process Mark"
-        ["Set mark" gnus-summary-mark-as-processable t]
+        ["Set/Toggle mark" gnus-summary-mark-as-processable t]
         ["Remove mark" gnus-summary-unmark-as-processable t]
         ["Remove all marks" gnus-summary-unmark-all-processable t]
         ["Invert marks" gnus-uu-invert-processable t]
@@ -10951,10 +10951,14 @@ number of articles marked is returned."
          (n (abs n)))
       (while (and
              (> n 0)
-             (if unmark
-                 (gnus-summary-remove-process-mark
-                  (gnus-summary-article-number))
-               (gnus-summary-set-process-mark (gnus-summary-article-number)))
+             (let ((article (gnus-summary-article-number)))
+               (if unmark
+                   (gnus-summary-remove-process-mark article)
+                 (if gnus-process-mark-toggle
+                     (if (memq article gnus-newsgroup-processable)
+                         (gnus-summary-remove-process-mark article)
+                       (gnus-summary-set-process-mark article))
+                   (gnus-summary-set-process-mark article))))
              (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))
        (setq n (1- n)))
       (when (/= 0 n)
index b3d17bc03fb16c7b00e0a9db1362fc4f6aff2b28..c0484622f40a5451d90dc4adb1098c5527dc02b1 100644 (file)
@@ -1112,7 +1112,7 @@ articles in the topic and its subtopics."
        ["Delete" gnus-topic-delete t]
        ["Rename..." gnus-topic-rename t]
        ["Create..." gnus-topic-create-topic t]
-       ["Mark" gnus-topic-mark-topic t]
+       ["Set/Toggle mark" gnus-topic-mark-topic t]
        ["Indent" gnus-topic-indent t]
        ["Sort" gnus-topic-sort-topics t]
        ["Previous topic" gnus-topic-goto-previous-topic t]
@@ -1436,7 +1436,7 @@ If PERMANENT, make it stay shown in subsequent sessions as well."
        (setcar (cdr (cadr topic)) 'visible)
        (gnus-group-list-groups)))))
 
-(defun gnus-topic-mark-topic (topic &optional unmark non-recursive)
+(defun gnus-topic-mark-topic (topic &optional unmark non-recursive no-toggle)
   "Mark all groups in the TOPIC with the process mark.
 If NON-RECURSIVE (which is the prefix) is t, don't mark its subtopics."
   (interactive
@@ -1450,8 +1450,13 @@ If NON-RECURSIVE (which is the prefix) is t, don't mark its subtopics."
       (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil
                                            (not non-recursive))))
        (while groups
-         (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
-                  (gnus-info-group (nth 1 (pop groups)))))))))
+          (let ((group (gnus-info-group (nth 1 (pop groups)))))
+           (if (and gnus-process-mark-toggle (not no-toggle))
+                (if (memq group gnus-group-marked)
+                    (gnus-group-remove-mark group )
+                  (gnus-group-set-mark group))
+              (if unmark (gnus-group-remove-mark group)
+                (gnus-group-set-mark group)))))))))
 
 (defun gnus-topic-unmark-topic (topic &optional _dummy non-recursive)
   "Remove the process mark from all groups in the TOPIC.
@@ -1462,7 +1467,7 @@ If NON-RECURSIVE (which is the prefix) is t, don't unmark its subtopics."
               gnus-topic-mode)
   (if (not topic)
       (call-interactively 'gnus-group-unmark-group)
-    (gnus-topic-mark-topic topic t non-recursive)))
+    (gnus-topic-mark-topic topic t non-recursive t)))
 
 (defun gnus-topic-get-new-news-this-topic (&optional n)
   "Check for new news in the current topic."
index 7de1cd1ddb1ef2fe15017f0dc80d832518a48ea9..21b5f31c1411190f3c5d538298e1d7cf471c6562 100644 (file)
@@ -1183,6 +1183,14 @@ newsgroups."
   :group 'gnus-summary-marks
   :type 'character)
 
+(defcustom gnus-process-mark-toggle nil
+  "If non-nil the process mark command toggles the process mark."
+  :version "28.1"
+  :group 'gnus-summary
+  :group 'gnus-group-various
+  :group 'gnus-group-topic
+  :type 'boolean)
+
 (defcustom gnus-large-newsgroup 200
   "The number of articles which indicates a large newsgroup.
 If the number of articles in a newsgroup is greater than this value,