]> code.delx.au - gnu-emacs/blobdiff - lisp/gnus/message.el
Finish idna->puny changes in last Message patch
[gnu-emacs] / lisp / gnus / message.el
index 9ab44fab12d027cc64d2647a0aad3bf8aecf5313..1ca7c5cafef737f6f6cf5997776a9b46ebfb2a31 100644 (file)
@@ -48,8 +48,9 @@
 (require 'dired)
 (require 'mm-util)
 (require 'rfc2047)
+(require 'puny)
 
-(autoload 'mailclient-send-it "mailclient") ;; Emacs 22 or contrib/
+(autoload 'mailclient-send-it "mailclient")
 
 (defvar gnus-message-group-art)
 (defvar gnus-list-identifiers) ; gnus-sum is required where necessary
@@ -1342,18 +1343,19 @@ If nil, Message won't auto-save."
   :link '(custom-manual "(message)Various Message Variables")
   :type '(choice directory (const :tag "Don't auto-save" nil)))
 
-(defcustom message-default-charset
-  (and (not (mm-multibyte-p)) 'iso-8859-1)
+(defcustom message-default-charset (and (not (mm-multibyte-p)) 'iso-8859-1)
   "Default charset used in non-MULE Emacsen.
 If nil, you might be asked to input the charset."
   :version "21.1"
   :group 'message
   :link '(custom-manual "(message)Various Message Variables")
   :type 'symbol)
+(make-obsolete-variable
+ 'message-default-charset
+ "The default charset comes from the language environment" "25.2")
 
-(defcustom message-dont-reply-to-names
-  (and (boundp 'mail-dont-reply-to-names) mail-dont-reply-to-names)
-  "*Addresses to prune when doing wide replies.
+(defcustom message-dont-reply-to-names mail-dont-reply-to-names
+  "Addresses to prune when doing wide replies.
 This can be a regexp, a list of regexps or a predicate function.
 Also, a value of nil means exclude your own user name only.
 
@@ -1366,10 +1368,9 @@ If a function email is passed as the argument."
                 (repeat :tag "Regexp List" regexp)))
 
 (defsubst message-dont-reply-to-names ()
-  (cond ((functionp message-dont-reply-to-names)
-         message-dont-reply-to-names)
-        ((stringp message-dont-reply-to-names)
-         (gmm-regexp-concat message-dont-reply-to-names))))
+  (if (functionp message-dont-reply-to-names)
+      message-dont-reply-to-names
+    (gmm-regexp-concat message-dont-reply-to-names)))
 
 (defvar message-shoot-gnksa-feet nil
   "*A list of GNKSA feet you are allowed to shoot.
@@ -1756,25 +1757,9 @@ no, only reply back to the author."
   :type '(radio (const :format "%v  " nil)
                (string :format "FQDN: %v")))
 
-(defcustom message-use-idna
-  (and (or (mm-coding-system-p 'utf-8)
-          (condition-case nil
-              (let (mucs-ignore-version-incompatibilities)
-                (require 'un-define))
-            (error)))
-       (condition-case nil
-          (require 'idna)
-        (file-error)
-        (invalid-operation))
-       idna-program
-       (executable-find idna-program)
-       (string= (idna-to-ascii "räksmörgås") "xn--rksmrgs-5wao1o")
-       t)
-  "Whether to encode non-ASCII in domain names into ASCII according to IDNA.
-GNU Libidn, and in particular the elisp package \"idna.el\" and
-the external program \"idn\", must be installed for this
-functionality to work."
-  :version "22.1"
+(defcustom message-use-idna t
+  "Whether to encode non-ASCII in domain names into ASCII according to IDNA."
+  :version "25.2"
   :group 'message-headers
   :link '(custom-manual "(message)IDNA")
   :type '(choice (const :tag "Ask" ask)
@@ -1926,7 +1911,6 @@ You must have the \"hashcash\" binary installed, see `hashcash-path'."
 (autoload 'gnus-output-to-rmail "gnus-util")
 (autoload 'gnus-request-post "gnus-int")
 (autoload 'gnus-server-string "gnus")
-(autoload 'idna-to-ascii "idna")
 (autoload 'message-setup-toolbar "messagexmas")
 (autoload 'mh-new-draft-name "mh-comp")
 (autoload 'mh-send-letter "mh-comp")
@@ -2196,33 +2180,26 @@ charset: "
   "Remove trailing \"(was: <old subject>)\" from SUBJECT lines.
 Leading \"Re: \" is not stripped by this function.  Use the function
 `message-strip-subject-re' for this."
-  (let* ((query message-subject-trailing-was-query)
-        (new) (found))
-    (setq found
-         (string-match
-          (if (eq query 'ask)
-              message-subject-trailing-was-ask-regexp
-            message-subject-trailing-was-regexp)
-          subject))
-    (if found
-       (setq new (substring subject 0 (match-beginning 0))))
-    (if (or (not found) (eq query nil))
-       subject
-      (if (eq query 'ask)
-         (if (message-y-or-n-p
-              "Strip `(was: <old subject>)' in subject? " t
-              (concat
-               "Strip `(was: <old subject>)' in subject "
-               "and use the new one instead?\n\n"
-               "Current subject is:   \""
-               subject "\"\n\n"
-               "New subject would be: \""
-               new "\"\n\n"
-               "See the variable `message-subject-trailing-was-query' "
-               "to get rid of this query."
-               ))
-             new subject)
-       new))))
+  (or
+   (let ((query message-subject-trailing-was-query) new)
+     (and query
+          (string-match (if (eq query 'ask)
+                            message-subject-trailing-was-ask-regexp
+                          message-subject-trailing-was-regexp)
+                        subject)
+          (setq new (substring subject 0 (match-beginning 0)))
+          (or (not (eq query 'ask))
+              (message-y-or-n-p
+               "Strip `(was: <old subject>)' in subject? " t
+               (concat
+                "Strip `(was: <old subject>)' in subject "
+                "and use the new one instead?\n\n"
+                "Current subject is:   \"" subject "\"\n\n"
+                "New subject would be: \"" new "\"\n\n"
+                "See the variable `message-subject-trailing-was-query' "
+                "to get rid of this query.")))
+          new))
+   subject))
 
 ;;; Suggested by Jonas Steverud  @  www.dtek.chalmers.se/~d4jonas/
 
@@ -2626,8 +2603,7 @@ PGG manual, depending on the value of `mml2015-use'."
                       (require 'mml2015)
                       mml2015-use)
                      ((eq arg  4) 'emacs-mime)
-                     ;; `booleanp' only available in Emacs 22+
-                     ((and (not (memq arg '(nil t)))
+                     ((and (not (booleanp arg))
                            (symbolp arg))
                       arg)
                      (t
@@ -2874,8 +2850,6 @@ See also `message-forbidden-properties'."
          (inhibit-read-only t))
       (remove-text-properties begin end message-forbidden-properties))))
 
-(autoload 'ecomplete-setup "ecomplete") ;; for Emacs <23.
-
 (defvar message-smileys '(":-)" ":)"
                           ":-(" ":("
                           ";-)" ";)")
@@ -2985,10 +2959,7 @@ M-RET    `message-newline-and-reformat' (break the line and reformat)."
   ;; Allow mail alias things.
   (cond
    ((message-mail-alias-type-p 'abbrev)
-    (if (fboundp 'mail-abbrevs-setup)
-       (mail-abbrevs-setup)
-      (if (fboundp 'mail-aliases-setup)        ; warning avoidance
-         (mail-aliases-setup))))
+    (mail-abbrevs-setup))
    ((message-mail-alias-type-p 'ecomplete)
     (ecomplete-setup)))
   (add-hook 'completion-at-point-functions 'message-completion-function nil t)
@@ -3014,8 +2985,6 @@ M-RET    `message-newline-and-reformat' (break the line and reformat)."
   (make-local-variable 'paragraph-separate)
   (make-local-variable 'paragraph-start)
   (make-local-variable 'adaptive-fill-regexp)
-  (unless (boundp 'adaptive-fill-first-line-regexp)
-    (setq adaptive-fill-first-line-regexp nil))
   (make-local-variable 'adaptive-fill-first-line-regexp)
   (let ((quote-prefix-regexp
         ;; User should change message-cite-prefix-regexp if
@@ -3038,20 +3007,8 @@ M-RET    `message-newline-and-reformat' (break the line and reformat)."
     (setq adaptive-fill-first-line-regexp
          (concat quote-prefix-regexp "\\|"
                  adaptive-fill-first-line-regexp)))
-  (make-local-variable 'auto-fill-inhibit-regexp)
-  ;;(setq auto-fill-inhibit-regexp "^[A-Z][^: \n\t]+:")
-  (setq auto-fill-inhibit-regexp nil)
-  (make-local-variable 'normal-auto-fill-function)
-  (setq normal-auto-fill-function 'message-do-auto-fill)
-  ;; KLUDGE: auto fill might already be turned on in `text-mode-hook'.
-  ;; In that case, ensure that it uses the right function.  The real
-  ;; solution would be not to use `define-derived-mode', and run
-  ;; `text-mode-hook' ourself at the end of the mode.
-  ;; -- Per Abrahamsen <abraham@dina.kvl.dk> Date: 2001-10-19.
-  ;; This kludge is unneeded in Emacs>=21 since define-derived-mode is
-  ;; now careful to run parent hooks after the body.  --Stef
-  (when auto-fill-function
-    (setq auto-fill-function normal-auto-fill-function)))
+  (setq-local auto-fill-inhibit-regexp nil)
+  (setq-local normal-auto-fill-function 'message-do-auto-fill))
 
 \f
 
@@ -3457,12 +3414,10 @@ Prefix arg means justify as well."
 This function is used as the value of `fill-paragraph-function' in
 Message buffers and is not meant to be called directly."
   (interactive (list (if current-prefix-arg 'full)))
-  (if (if (boundp 'filladapt-mode) filladapt-mode)
-      nil
-    (if (message-point-in-header-p)
-       (message-fill-field)
-      (message-newline-and-reformat arg t))
-    t))
+  (if (message-point-in-header-p)
+      (message-fill-field)
+    (message-newline-and-reformat arg t))
+  t)
 
 (defun message-point-in-header-p ()
   "Return t if point is in the header."
@@ -3746,15 +3701,11 @@ If REMOVE is non-nil, remove newlines, too.
 To use this automatically, you may add this function to
 `gnus-message-setup-hook'."
   (interactive "P")
-  (let ((citexp
-        (concat
-         "^\\("
-         (when (boundp 'message-yank-cited-prefix)
-           (concat message-yank-cited-prefix "\\|"))
-         message-yank-prefix
-         "\\)+ *\n"
-         )))
-    (message "removing `%s'" citexp)
+  (let ((citexp (concat "^\\("
+                       (concat message-yank-cited-prefix "\\|")
+                       message-yank-prefix
+                       "\\)+ *\n")))
+    (message "Removing `%s'" citexp)
     (save-excursion
       (message-goto-body)
       (while (re-search-forward citexp nil t)
@@ -3912,8 +3863,13 @@ This function uses `mail-citation-hook' if that is non-nil."
 (defun message-insert-formatted-citation-line (&optional from date tz)
   "Function that inserts a formatted citation line.
 The optional FROM, and DATE are strings containing the contents of
-the From header and the Date header respectively.  The optional TZ
-is a number of seconds, overrides the time zone of DATE.
+the From header and the Date header respectively.
+
+The optional TZ is omitted or nil for Emacs local time, t for
+Universal Time, `wall' for system wall clock time, or a string as
+in the TZ environment variable.  It can also be a list (as from
+`current-time-zone') or an integer (as from `decode-time')
+applied without consideration for daylight saving time.
 
 See `message-citation-line-format'."
   ;; The optional args are for testing/debugging.  They will disappear later.
@@ -4004,7 +3960,7 @@ See `message-citation-line-format'."
                               (>= i ?a)))
                  (push i lst)
                  (push (condition-case nil
-                           (gmm-format-time-string (format "%%%c" i) time tz)
+                           (format-time-string (format "%%%c" i) time tz)
                          (error (format ">%c<" i)))
                        lst))
                (setq i (1+ i)))
@@ -5704,10 +5660,7 @@ In posting styles use `(\"Expires\" (make-expires-date 30))'."
   "Make a From header."
   (let* ((style message-from-style)
         (login (or address (message-make-address)))
-        (fullname (or name
-                      (and (boundp 'user-full-name)
-                           user-full-name)
-                      (user-full-name))))
+        (fullname (or name user-full-name (user-full-name))))
     (when (string= fullname "&")
       (setq fullname (user-login-name)))
     (with-temp-buffer
@@ -5807,8 +5760,7 @@ give as trustworthy answer as possible."
       ;; `system-name' returned the right result.
       sysname)
      ;; Try `mail-host-address'.
-     ((and (boundp 'mail-host-address)
-          (stringp mail-host-address)
+     ((and (stringp mail-host-address)
           (not (string-match message-bogus-system-names mail-host-address)))
       mail-host-address)
      ;; We try `user-mail-address' as a backup.
@@ -5899,7 +5851,7 @@ subscribed address (and not the additional To and Cc header contents)."
        ;; the domain part, i.e., if it is a local user's address.
        (setq ace (if (string-match "\\`[[:ascii:]]*\\'" rhs)
                      rhs
-                   (downcase (idna-to-ascii rhs))))
+                   (downcase (puny-encode-domain rhs))))
        (when (and (not (equal rhs ace))
                   (or (not (eq message-use-idna 'ask))
                       (y-or-n-p (format "Replace %s with %s in %s:? "
@@ -6134,10 +6086,7 @@ Headers already prepared in the buffer are not modified."
   "Split current line, moving portion beyond point vertically down.
 If the current line has `message-yank-prefix', insert it on the new line."
   (interactive "*")
-  (condition-case nil
-      (split-line message-yank-prefix) ;; Emacs 22.1+ supports arg.
-    (error
-     (split-line))))
+  (split-line message-yank-prefix))
 
 (defun message-insert-header (header value)
   (insert (capitalize (symbol-name header))
@@ -6340,11 +6289,10 @@ moved to the beginning "
    ((and message-beginning-of-line (message-point-in-header-p))
     (let* ((point (point))
            (bol (progn (beginning-of-line n) (point)))
-           (boh (message-beginning-of-header (and (boundp 'visual-line-mode)
-                                                  visual-line-mode))))
+           (boh (message-beginning-of-header visual-line-mode)))
       (goto-char (if (and boh (or (< boh point) (= bol point))) boh bol))))
    ;; Go to beginning of visual line
-   ((and (boundp 'visual-line-mode) visual-line-mode)
+   (visual-line-mode
     (beginning-of-visual-line n))
    ;; Go to beginning of line.
    ((beginning-of-line n))))
@@ -6424,10 +6372,7 @@ moved to the beginning "
                               "Message already being composed; erase? ")
                            (message nil))))
            (error "Message being composed")))
-      (funcall (or switch-function
-                  (if (fboundp #'pop-to-buffer-same-window)
-                      #'pop-to-buffer-same-window
-                    #'pop-to-buffer))
+      (funcall (or switch-function 'pop-to-buffer-same-window)
               name)
       (set-buffer name))
     (erase-buffer)
@@ -7259,7 +7204,7 @@ header line with the old Message-ID."
     (cond ((save-window-excursion
             (with-output-to-temp-buffer "*Directory*"
               (with-current-buffer standard-output
-                (fundamental-mode))    ; for Emacs 20.4+
+                (fundamental-mode))
               (buffer-disable-undo standard-output)
               (let ((default-directory "/"))
                 (call-process
@@ -7606,10 +7551,8 @@ is for the internal use."
 (defun message-forward-rmail-make-body (forward-buffer)
   (save-window-excursion
     (set-buffer forward-buffer)
-    (if (rmail-msg-is-pruned)
-       (if (fboundp 'rmail-msg-restore-non-pruned-header)
-           (rmail-msg-restore-non-pruned-header) ; Emacs 22
-         (rmail-toggle-header 0))))              ; Emacs 23
+    (when (rmail-msg-is-pruned)
+      (rmail-toggle-header 0)))
   (message-forward-make-body forward-buffer))
 
 ;; Fixme: Should have defcustom.
@@ -7683,6 +7626,9 @@ is for the internal use."
             (let ((case-fold-search t))
               (re-search-forward "^mime-version:" nil t)))
            (message-inhibit-ecomplete t)
+           ;; We don't want smtpmail.el to encode anything, either.
+           (sendmail-coding-system 'raw-text)
+           (select-safe-coding-system-function nil)
            message-required-mail-headers
            message-generate-hashcash
            rfc2047-encode-encoded-words)
@@ -7859,12 +7805,10 @@ Pre-defined symbols include `message-tool-bar-gnome' and
 (defcustom message-tool-bar-gnome
   '((ispell-message "spell" nil
                    :vert-only t
-                   :visible (or (not (boundp 'flyspell-mode))
-                                (not flyspell-mode)))
+                   :visible (not flyspell-mode))
     (flyspell-buffer "spell" t
                     :vert-only t
-                    :visible (and (boundp 'flyspell-mode)
-                                  flyspell-mode)
+                    :visible flyspell-mode
                     :help "Flyspell whole buffer")
     (message-send-and-exit "mail/send" t :label "Send")
     (message-dont-send "mail/save-draft")
@@ -7926,12 +7870,9 @@ When FORCE, rebuild the tool bar."
             (or (not message-tool-bar-map) force))
     (setq message-tool-bar-map
          (let* ((load-path
-                 (gmm-image-load-path-for-library "message"
-                                                  "mail/save-draft.xpm"
-                                                  nil t))
-                (image-load-path (cons (car load-path)
-                                       (when (boundp 'image-load-path)
-                                         image-load-path))))
+                 (image-load-path-for-library
+                  "message" "mail/save-draft.xpm" nil t))
+                (image-load-path (cons (car load-path) image-load-path)))
            (gmm-tool-bar-from-list message-tool-bar
                                    message-tool-bar-zap-list
                                    'message-mode-map))))
@@ -7982,10 +7923,8 @@ not in those headers.  If that variable is nil, indent with the
 regular text mode tabbing command."
   (interactive)
   (cond
-   ((if (and (boundp 'completion-fail-discreetly)
-             (fboundp 'completion-at-point))
-        (let ((completion-fail-discreetly t)) (completion-at-point))
-      (funcall (or (message-completion-function) #'ignore)))
+   ((let ((completion-fail-discreetly t))
+      (completion-at-point))
     ;; Completion was performed; nothing else to do.
     nil)
    (message-tab-body-function (funcall message-tab-body-function))
@@ -8031,41 +7970,7 @@ regular text mode tabbing command."
                 group)
               collection))
        gnus-active-hashtb))
-    (message-completion-in-region b e collection)))
-
-(defalias 'message-completion-in-region
-  (if (fboundp 'completion-in-region)
-      'completion-in-region
-    (lambda (b e hashtb)
-      (let* ((string (buffer-substring b e))
-             (completions (all-completions string hashtb))
-             comp)
-        (delete-region b (point))
-        (cond
-         ((= (length completions) 1)
-          (if (string= (car completions) string)
-              (progn
-                (insert string)
-                (message "Only matching group"))
-            (insert (car completions))))
-         ((and (setq comp (try-completion string hashtb))
-               (not (string= comp string)))
-          (insert comp))
-         (t
-          (insert string)
-          (if (not comp)
-              (message "No matching groups")
-            (save-selected-window
-              (pop-to-buffer "*Completions*")
-              (buffer-disable-undo)
-              (let ((buffer-read-only nil))
-                (erase-buffer)
-                (let ((standard-output (current-buffer)))
-                  (display-completion-list (sort completions 'string<)))
-                (setq buffer-read-only nil)
-                (goto-char (point-min))
-                (delete-region (point)
-                               (progn (forward-line 3) (point))))))))))))
+    (completion-in-region b e collection)))
 
 (defun message-expand-name ()
   (cond ((and (memq 'eudc message-expand-name-databases)
@@ -8094,7 +7999,7 @@ The following arguments may contain lists of values."
       (save-window-excursion
         (with-output-to-temp-buffer " *MESSAGE information message*"
           (with-current-buffer " *MESSAGE information message*"
-           (fundamental-mode)          ; for Emacs 20.4+
+           (fundamental-mode)
            (mapc 'princ text)
            (goto-char (point-min))))
        (funcall ask question))
@@ -8187,13 +8092,9 @@ regexp VARSTR."
 
 (defun message-read-from-minibuffer (prompt &optional initial-contents)
   "Read from the minibuffer while providing abbrev expansion."
-  (if (fboundp 'mail-abbrevs-setup)
-      (let ((minibuffer-setup-hook 'mail-abbrevs-setup)
-           (minibuffer-local-map message-minibuffer-local-map))
-       (read-from-minibuffer prompt initial-contents))
-    (let ((minibuffer-setup-hook 'mail-abbrev-minibuffer-setup-hook)
-         (minibuffer-local-map message-minibuffer-local-map))
-      (read-string prompt initial-contents))))
+  (let ((minibuffer-setup-hook 'mail-abbrevs-setup)
+       (minibuffer-local-map message-minibuffer-local-map))
+    (read-from-minibuffer prompt initial-contents)))
 
 (defun message-use-alternative-email-as-from ()
   "Set From field of the outgoing message to the first matching