Add new user option to Gnus to allow `#' to toggle

* 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.
This commit is contained in:
Alex Bochannek 2021-06-02 07:41:25 +02:00 committed by Lars Ingebrigtsen
parent 4784b6eb9a
commit 16793dc35a
6 changed files with 71 additions and 31 deletions

View 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)}

View file

@ -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.

View 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)

View 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)

View 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."

View 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,