]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-compat.el
emacs: Increase consistency of library headers
[notmuch] / emacs / notmuch-compat.el
index c3d827af59969f9f7fe5aac04b3c9d8835bf300f..9d82a7293a3805bc5676def8339f5d241a5206af 100644 (file)
@@ -1,8 +1,44 @@
-;; Compatibility functions for emacs 23 and 24 pre 24.4
+;;; notmuch-compat.el --- compatibility functions for earlier versions of emacs
+;;
+;; The functions in this file are copied from more modern versions of
+;; emacs and are Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2017
+;; Free Software Foundation, Inc.
+;;
+;; This file is part of Notmuch.
+;;
+;; Notmuch is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Notmuch is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Notmuch.  If not, see <https://www.gnu.org/licenses/>.
 
-;; The functions in this file are copied from eamcs 24.4 and are
-;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2014 Free Software
-;; Foundation, Inc.
+;;; Code:
+
+;; emacs master has a bugfix for folding long headers when sending
+;; messages. Include the fix for earlier versions of emacs. To avoid
+;; interfering with gnus we only run the hook when called from
+;; notmuch-message-mode.
+
+(declare-function mail-header-fold-field "mail-parse" nil)
+
+(defun notmuch-message--fold-long-headers ()
+  (when (eq major-mode 'notmuch-message-mode)
+    (goto-char (point-min))
+    (while (not (eobp))
+      (when (and (looking-at "[^:]+:")
+                (> (- (line-end-position) (point)) 998))
+       (mail-header-fold-field))
+      (forward-line 1))))
+
+(unless (fboundp 'message--fold-long-headers)
+  (add-hook 'message-header-hook 'notmuch-message--fold-long-headers))
 
 (if (fboundp 'setq-local)
     (defalias 'notmuch-setq-local 'setq-local)
@@ -15,7 +51,7 @@ Backport of setq-local for emacs without setq-local (pre 24.3)."
 (if (fboundp 'read-char-choice)
     (defalias 'notmuch-read-char-choice 'read-char-choice)
   (defun notmuch-read-char-choice (prompt chars &optional inhibit-keyboard-quit)
-  "Read and return one of CHARS, prompting for PROMPT.
+    "Read and return one of CHARS, prompting for PROMPT.
 Any input that is not one of CHARS is ignored.
 
 If optional argument INHIBIT-KEYBOARD-QUIT is non-nil, ignore
@@ -24,49 +60,49 @@ keyboard-quit events while waiting for a valid input.
 This is an exact copy of this function from emacs 24 for use on
 emacs 23, except with the one emacs 24 only function it calls
 inlined."
-  (unless (consp chars)
-    (error "Called `read-char-choice' without valid char choices"))
-  (let (char done show-help (helpbuf " *Char Help*"))
-    (let ((cursor-in-echo-area t)
-          (executing-kbd-macro executing-kbd-macro)
-         (esc-flag nil))
-      (save-window-excursion         ; in case we call help-form-show
-       (while (not done)
-         (unless (get-text-property 0 'face prompt)
-           (setq prompt (propertize prompt 'face 'minibuffer-prompt)))
-         (setq char (let ((inhibit-quit inhibit-keyboard-quit))
-                      (read-key prompt)))
-         (and show-help (buffer-live-p (get-buffer helpbuf))
-              (kill-buffer helpbuf))
-         (cond
-          ((not (numberp char)))
-          ;; If caller has set help-form, that's enough.
-          ;; They don't explicitly have to add help-char to chars.
-          ((and help-form
-                (eq char help-char)
-                (setq show-help t)
-                ;; This is an inlined copy of help-form-show as that
-                ;; was introduced in emacs 24 too.
-                (let ((msg (eval help-form)))
-                  (if (stringp msg)
+    (unless (consp chars)
+      (error "Called `read-char-choice' without valid char choices"))
+    (let (char done show-help (helpbuf " *Char Help*"))
+      (let ((cursor-in-echo-area t)
+           (executing-kbd-macro executing-kbd-macro)
+           (esc-flag nil))
+       (save-window-excursion        ; in case we call help-form-show
+         (while (not done)
+           (unless (get-text-property 0 'face prompt)
+             (setq prompt (propertize prompt 'face 'minibuffer-prompt)))
+           (setq char (let ((inhibit-quit inhibit-keyboard-quit))
+                        (read-key prompt)))
+           (and show-help (buffer-live-p (get-buffer helpbuf))
+                (kill-buffer helpbuf))
+           (cond
+            ((not (numberp char)))
+            ;; If caller has set help-form, that's enough.
+            ;; They don't explicitly have to add help-char to chars.
+            ((and help-form
+                  (eq char help-char)
+                  (setq show-help t)
+                  ;; This is an inlined copy of help-form-show as that
+                  ;; was introduced in emacs 24 too.
+                  (let ((msg (eval help-form)))
+                    (when (stringp msg)
                       (with-output-to-temp-buffer " *Char Help*"
                         (princ msg))))))
-          ((memq char chars)
-           (setq done t))
-          ((and executing-kbd-macro (= char -1))
-           ;; read-event returns -1 if we are in a kbd macro and
-           ;; there are no more events in the macro.  Attempt to
-           ;; get an event interactively.
-           (setq executing-kbd-macro nil))
-          ((not inhibit-keyboard-quit)
-           (cond
-            ((and (null esc-flag) (eq char ?\e))
-             (setq esc-flag t))
-            ((memq char '(?\C-g ?\e))
-             (keyboard-quit))))))))
-    ;; Display the question with the answer.  But without cursor-in-echo-area.
-    (message "%s%s" prompt (char-to-string char))
-    char)))
+            ((memq char chars)
+             (setq done t))
+            ((and executing-kbd-macro (= char -1))
+             ;; read-event returns -1 if we are in a kbd macro and
+             ;; there are no more events in the macro.  Attempt to
+             ;; get an event interactively.
+             (setq executing-kbd-macro nil))
+            ((not inhibit-keyboard-quit)
+             (cond
+              ((and (null esc-flag) (eq char ?\e))
+               (setq esc-flag t))
+              ((memq char '(?\C-g ?\e))
+               (keyboard-quit))))))))
+      ;; Display the question with the answer.  But without cursor-in-echo-area.
+      (message "%s%s" prompt (char-to-string char))
+      char)))
 
 ;; End of compatibility functions