From fa9196a0c25541a98478437323bdd6fd89efab58 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jakub=20Je=C4=8Dm=C3=ADnek?= Date: Thu, 30 May 2024 10:54:57 +0200 Subject: [PATCH] Show all date options when adding Gnus scores interactively * lisp/gnus/gnus-score.el (gnus-summary-increase-score): Rename 'char-to-type' variable to 'char-to-types' and bind all legal types for date header. * lisp/gnus/gnus-score.el (gnus-summary-score-entry): Provide better default values for each scoring type and cast 'match' to number only if necessary. Co-authored-by: Alex Bochannek (cherry picked from commit 39b704e36e308783dcec791d333fca317c6a5202) --- doc/misc/gnus.texi | 9 ++++++++ lisp/gnus/gnus-score.el | 47 ++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index 0298f2304ea..4fcdcf9babe 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -20093,6 +20093,9 @@ Regexp matching. @item date @table @kbd +@item r +Regexp matching. + @item b Before date. @@ -20101,6 +20104,12 @@ After date. @item n This date. + +@item < +Less than days. + +@item > +Greater than days. @end table @item number diff --git a/lisp/gnus/gnus-score.el b/lisp/gnus/gnus-score.el index 6cf99dd1c5c..ca1bb9bb874 100644 --- a/lisp/gnus/gnus-score.el +++ b/lisp/gnus/gnus-score.el @@ -560,18 +560,18 @@ current score file." (?d "date" nil nil date) (?f "followup" nil nil string) (?t "thread" "message-id" nil string))) - (char-to-type + (char-to-types '((?s s "substring" string) (?e e "exact string" string) (?f f "fuzzy string" string) - (?r r "regexp string" string) + (?r r "regexp string" string date) (?z s "substring" body-string) (?p r "regexp string" body-string) (?b before "before date" date) (?a after "after date" date) (?n at "this date" date) - (?< < "less than number" number) - (?> > "greater than number" number) + (?< < "less than number" number date) + (?> > "greater than number" number date) (?= = "equal to number" number))) (current-score-file gnus-current-score-file) (char-to-perm @@ -600,8 +600,8 @@ current score file." (unless tchar (let ((legal-types (seq-filter (lambda (s) - (eq (nth 4 entry) (nth 3 s))) - char-to-type))) + (member (nth 4 entry) (nthcdr 3 s))) + char-to-types))) (setq header-string (format "%s header `%s' with match type:" (if increase "Increase" "Lower") @@ -763,12 +763,16 @@ If optional argument `EXTRA' is non-nil, it's a non-standard overview header." header (if (< score 0) "lower" "raise")) (cond ((numberp match) (int-to-string match)) + ;; Provide better defaults if we're scoring on date header ((string= header "date") - (int-to-string - (- - (/ (car (time-convert (current-time) 1)) 86400) - (/ (car (time-convert (gnus-date-get-time match) 1)) - 86400)))) + (if (or (eq type '<) (eq type '>)) + ;; Determine the time difference in days between today + ;; and the article's date + (format-seconds "%d" + (time-subtract + (current-time) + (gnus-date-get-time match))) + (gnus-date-iso8601 match))) (t match))))) ;; If this is an integer comparison, we transform from string to int. @@ -778,16 +782,13 @@ If optional argument `EXTRA' is non-nil, it's a non-standard overview header." (set-text-properties 0 (length match) nil match)) ;; Modify match and type for article age scoring. - (if (string= "date" (nth 0 (assoc header gnus-header-index))) - (let ((age (string-to-number match))) - (if (or (< age 0) - (string= "0" match)) - (user-error "Article age must be a positive number")) - (setq match age - type (cond ((eq type 'after) - '<) - ((eq type 'before) - '>))))) + (when (and (string= header "date") + (or (eq type '<) (eq type '>))) + (let ((age (string-to-number match))) + (if (or (< age 0) + (string= "0" match)) + (user-error "Article age must be a positive number")) + (setq match age))) (unless (eq date 'now) ;; Add the score entry to the score file. @@ -1675,7 +1676,7 @@ score in `gnus-newsgroup-scored' by SCORE." ((eq type 'at) (setq match-func 'string= match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'regexp) + ((or (eq type 'regexp) (eq type 'r)) (setq match-func 'string-match match (nth 0 kill))) (t (error "Invalid match type: %s" type))) @@ -1702,6 +1703,8 @@ score in `gnus-newsgroup-scored' by SCORE." (gnus-score-set 'touched '(t) alist) (setcdr entries (cdr rest)) (setq rest entries))) + (when (stringp (nth 0 kill)) + (set-text-properties 0 1 nil (nth 0 kill))) (setq entries rest))))) nil) -- 2.39.2