]> git.notmuchmail.org Git - notmuch/blobdiff - emacs/notmuch-compat.el
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / emacs / notmuch-compat.el
index 388ef70fc3b31e6d16fa4db8ec47963591b17df2..179bf59ca86116e79b64393ff76c41d65db53be9 100644 (file)
@@ -1,14 +1,31 @@
-;; Compatibility functions for earlier versions of emacs
-
+;;; notmuch-compat.el --- compatibility functions for earlier versions of emacs  -*- lexical-binding: t -*-
+;;
 ;; 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.
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; 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.
+;;
+;; 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/>.
+
+;;; Code:
+
+;; Before Emacs 26.1 lines that are longer than 998 octets were not.
+;; folded. Commit 77bbca8c82f6e553c42abbfafca28f55fc995d00 fixed
+;; that. Until we drop support for Emacs 25 we have to backport that
+;; fix. 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)
 
 (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)
-  (defmacro notmuch-setq-local (var val)
-    "Set variable VAR to value VAL in current buffer.
-
-Backport of setq-local for emacs without setq-local (pre 24.3)."
-    `(set (make-local-variable ',var) ,val)))
-
-(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.
-Any input that is not one of CHARS is ignored.
-
-If optional argument INHIBIT-KEYBOARD-QUIT is non-nil, ignore
-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)
-                        (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)))
-
-;; End of compatibility functions
+;; `dlet' isn't available until Emacs 28.1.  Below is a copy, with the
+;; addition of `with-no-warnings'.
+(defmacro notmuch-dlet (binders &rest body)
+  "Like `let*' but using dynamic scoping."
+  (declare (indent 1) (debug let))
+  `(let (_)
+     (with-no-warnings  ; Quiet "lacks a prefix" warning.
+       ,@(mapcar (lambda (binder)
+                  `(defvar ,(if (consp binder) (car binder) binder)))
+                binders))
+     (let* ,binders ,@body)))
 
 (provide 'notmuch-compat)
+
+;;; notmuch-compat.el ends here