Teach gnus/message about international Re: variants

* lisp/mail/mail-utils.el (mail-re-regexps): New defcustom,
contains the components used to construct 'rmail-re-abbrevs' and
'message-subject-re-regexp'.
* lisp/gnus/message.el (message-subject-re-regexp): Derive from
'mail-re-regexps'.
(message-strip-subject-re): Make the match case-insensitive.
* lisp/mail/rmail.el (rmail-re-abbrevs): Derive from
'mail-re-regexps'.  Update 'rmail-reply-regexp' when it changes.
(rmail-reply-regexp): Set to nil, 'rmail-re-abbrevs' will set
it.

* doc/emacs/rmail.texi (Rmail Reply): Describe
'mail-re-regexps'.
* doc/misc/message.texi (Message Headers): Describe
'mail-re-regexps'.

(Bug#72442)
This commit is contained in:
Robert Pluim 2024-08-22 18:49:12 +02:00
parent 2f8c2e64e0
commit 315519fa7c
6 changed files with 111 additions and 19 deletions

View file

@ -776,6 +776,14 @@ to. The @samp{To} field starts out as the address of the person who
sent the message you received, and the @samp{CC} field starts out with
all the other recipients of that message.
@vindex rmail-re-abbrevs
@vindex rmail-reply-prefix
@vindex mail-re-regexps
The @samp{Subject} header field may contain one or more instances of
@samp{Re:} or localized variants thereof. These are removed if they
match @code{rmail-re-abbrevs} (which is initialized from
@code{mail-re-regexps}), and @code{rmail-reply-prefix} is prepended.
@vindex mail-dont-reply-to-names
You can exclude certain recipients from being included automatically
in replies, using the variable @code{mail-dont-reply-to-names}. Its

View file

@ -1688,13 +1688,14 @@ result is inserted.
@item message-subject-re-regexp
@vindex message-subject-re-regexp
@vindex mail-re-regexps
@cindex Aw
@cindex Sv
@cindex Re
Responses to messages have subjects that start with @samp{Re: }. This
is @emph{not} an abbreviation of the English word ``response'', but it
comes from the Latin ``res'', and means ``in the matter of''. Some
illiterate nincompoops have failed to grasp this fact, and have
standards-challenged companies have failed to grasp this fact, and have
``internationalized'' their software to use abominations like
@samp{Aw: } (``antwort'') or @samp{Sv: } (``svar'') instead, which is
meaningless and evil. However, you may have to deal with users that
@ -1726,6 +1727,16 @@ responding to a message:
))
@end lisp
You shouldn't need to do this, since the default value of
@code{message-subject-re-regexp} is initialized based on
@code{mail-re-regexps}, which covers most known cases of such
internationalization, and is a lot easier to customize. Customizing
@code{mail-re-regexps} updates @code{message-subject-re-regexp} to
match.
Note that the regexp is matched case-insensitively against the
@samp{Subject} header contents.
@item message-subject-trailing-was-query
@vindex message-subject-trailing-was-query
@vindex message-subject-trailing-was-ask-regexp

View file

@ -660,6 +660,32 @@ only search in input history. If you customize it to the symbol 'dwim',
those commands search in input history only when the point is after the
last prompt.
+++
** Mail-util
*** New user option 'mail-re-regexps'.
This contains the list of regular expressions used to match "Re:" and
international variants of it when modifying the Subject field in
replies.
+++
** Rmail
*** 'rmail-re-abbrevs' default value is now derived from 'mail-re-regexps'.
'mail-re-regexps' is a new user option that is easier to customize than
'rmail-re-abbrevs'. 'rmail-re-abbrevs' is still honored if it was
already set.
+++
** Message
*** 'message-subject-re-regexp' default value is now derived from 'mail-re-regexps'.
'mail-re-regexps' is a new user option that is easier to customize than
'message-subject-re-regexp'. 'message-subject-re-regexp' is still
honored if it was already set.
*** 'message-strip-subject-re' now matches case-insensitively.
** SHR
+++

View file

@ -312,11 +312,20 @@ any confusion."
regexp))
(defcustom message-subject-re-regexp
"^[ \t]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)* ?:[ \t]*\\)*[ \t]*"
"Regexp matching \"Re: \" in the subject line."
(mail--wrap-re-regexp
(concat
"\\("
(string-join mail-re-regexps "\\|")
"\\)"))
"Regexp matching \"Re: \" in the subject line.
Matching is done case-insensitively.
Initialized from the value of `mail-re-regexps', which is easier to
customize."
:group 'message-various
:link '(custom-manual "(message)Message Headers")
:type 'regexp)
:type 'regexp
:set-after '(mail-re-regexps)
:version "31.1")
(defcustom message-screenshot-command '("import" "png:-")
"Command to take a screenshot.
@ -2264,10 +2273,12 @@ see `message-narrow-to-headers-or-head'."
subject)))
(defun message-strip-subject-re (subject)
"Remove \"Re:\" from subject lines in string SUBJECT."
(if (string-match message-subject-re-regexp subject)
(substring subject (match-end 0))
subject))
"Remove \"Re:\" from subject lines in string SUBJECT.
This uses `mail-re-regexps', matching is done case-insensitively."
(let ((case-fold-search t))
(if (string-match message-subject-re-regexp subject)
(substring subject (match-end 0))
subject)))
(defcustom message-replacement-char "."
"Replacement character used instead of unprintable or not decodable chars."

View file

@ -46,6 +46,37 @@ also the To field, unless this would leave an empty To field."
:type '(choice regexp (const :tag "Your Name" nil))
:group 'mail)
(defun mail--wrap-re-regexp (re)
(concat "\\`[ \t]*"
"\\("
re
; Re(1) or Re[1] or Re^1
"\\(([0-9]+)\\|\\[[0-9]+\\]\\|\\^[0-9]+\\)?"
; SPC/NBSP followed by colon and TAB/SPC
" ?\u00a0*[:][ \t]*"
; Handle repetition, eg "Re[1]: Re[2]:"
"\\)*"
"[ \t]*"))
;;;###autoload
(defcustom mail-re-regexps
'("RE" "R\u00c9\\.?" "FWD?" "رد" "回复" "回覆" "SV" "Antw\\.?"
"VS" "REF" "AW" "ΑΠ" "ΣΧΕΤ" "השב" "" "R" "RIF" "BLS" "RES"
"Odp" "YNT" "ATB")
"List of localized \"Re:\" abbreviations in various languages.
Each component can be a regular expression or a simple string. Matching
is done case-insensitively. Used to initialize the legacy
`rmail-re-abbrevs' and `message-subject-re-regexp' user options."
:type '(repeat regexp)
:set (lambda (sym val)
(custom-set-default sym val)
(dolist (sym '(rmail-re-abbrevs
message-subject-re-regexp))
(when (get sym 'standard-value)
(custom-reevaluate-setting sym))))
:group 'mail
:version "31.1")
(defvar epa-inhibit)
;; Returns t if file FILE is an Rmail file.
;;;###autoload

View file

@ -525,22 +525,27 @@ Examples:
(defvar rmail-reply-prefix "Re: "
"String to prepend to Subject line when replying to a message.")
;; Note: this is matched with case-fold-search bound to t.
(defcustom rmail-re-abbrevs
"\\(RE\\|رد\\|回复\\|回覆\\|SV\\|Antw\\|VS\\|REF\\|AW\\|ΑΠ\\|ΣΧΕΤ\\|השב\\|Vá\\|R\\|RIF\\|BLS\\|RES\\|Odp\\|YNT\\|ATB\\)"
"Regexp with localized \"Re:\" abbreviations in various languages."
:version "28.1"
:type 'regexp)
(defvar rmail-reply-regexp nil ;; set by `rmail-re-abbrevs
"Regexp to delete from Subject line before inserting `rmail-reply-prefix'.")
;; Some mailers use "Re(2):" or "Re^2:" or "Re: Re:" or "Re[2]:".
;; This pattern should catch all the common variants.
;; rms: I deleted the change to delete tags in square brackets
;; because they mess up RT tags.
(defvar rmail-reply-regexp
(concat "\\`\\("
rmail-re-abbrevs
"\\(([0-9]+)\\|\\[[0-9]+\\]\\|\\^[0-9]+\\)?\u00a0*[:] *\\)*")
"Regexp to delete from Subject line before inserting `rmail-reply-prefix'.")
;; Note: this is matched with case-fold-search bound to t.
(defcustom rmail-re-abbrevs
(concat "\\("
(string-join mail-re-regexps "\\|")
"\\)")
"Regexp with localized \"Re:\" abbreviations in various languages.
Matching is done case-insensitively.
Initialized from `mail-re-regexps', which is easier to customize."
:set-after '(mail-re-regexps)
:set (lambda (sym val)
(custom-set-default sym val)
(setq rmail-reply-regexp (mail--wrap-re-regexp val)))
:type 'regexp
:version "31.1")
(defcustom rmail-display-summary nil
"If non-nil, Rmail always displays the summary buffer."