emacs: add compatibility functions for emacs 23
authorMark Walters <markwalters1009@gmail.com>
Tue, 15 Nov 2016 19:48:45 +0000 (19:48 +0000)
committerDavid Bremner <david@tethera.net>
Thu, 17 Nov 2016 01:42:34 +0000 (21:42 -0400)
Some of the recent changes to the emacs code have used functions
introduced in emacs 24. The functions used are read-char-choice and
setq-local. This changeset adds a file notmuch-compat.el which
contains compatibility functions so that it should work on emacs
23.

Note, since these functions are taken almost unchanged from the emacs
source they are copyright the Free Software Foundation, and the header
in the file reflects that.

emacs/Makefile.local
emacs/notmuch-address.el
emacs/notmuch-company.el
emacs/notmuch-compat.el [new file with mode: 0644]
emacs/notmuch-lib.el
emacs/notmuch-maildir-fcc.el

index 2d6aedbdfd5d5e1c98485ad9b27ee69e635431cd..558e68f2e2b71b38ef9ee8e8bfc5e7ee0a85605c 100644 (file)
@@ -3,6 +3,7 @@
 dir := emacs
 emacs_sources := \
        $(dir)/notmuch-lib.el \
+       $(dir)/notmuch-compat.el \
        $(dir)/notmuch-parser.el \
        $(dir)/notmuch.el \
        $(dir)/notmuch-query.el \
index 10eaab196267bbad86c967e1318ea6083a577b44..34793dbec99e235ae863ae63dbc6d79881ce3efb 100644 (file)
@@ -136,11 +136,11 @@ toggles the setting in this buffer."
   (interactive)
   (if (local-variable-p 'notmuch-address-command)
       (kill-local-variable 'notmuch-address-command)
-    (setq-local notmuch-address-command 'internal))
+    (notmuch-setq-local notmuch-address-command 'internal))
   (if (boundp 'company-idle-delay)
       (if (local-variable-p 'company-idle-delay)
          (kill-local-variable 'company-idle-delay)
-       (setq-local company-idle-delay nil))))
+       (notmuch-setq-local company-idle-delay nil))))
 
 (defun notmuch-address-matching (substring)
   "Returns a list of completion candidates matching SUBSTRING.
index 168315ff225fb68034979ad38cab1ebd976cde33..5d75c1455933e0548cb44fe47b26d718c4656a14 100644 (file)
@@ -28,6 +28,7 @@
 ;;; Code:
 
 (eval-when-compile (require 'cl))
+(require 'notmuch-lib)
 
 (defvar notmuch-company-last-prefix nil)
 (make-variable-buffer-local 'notmuch-company-last-prefix)
@@ -53,7 +54,7 @@
   ;; internal completion) can still be accessed via standard company
   ;; functions, e.g., company-complete.
   (unless (eq notmuch-address-command 'internal)
-    (setq-local company-idle-delay nil)))
+    (notmuch-setq-local company-idle-delay nil)))
 
 ;;;###autoload
 (defun notmuch-company (command &optional arg &rest _ignore)
diff --git a/emacs/notmuch-compat.el b/emacs/notmuch-compat.el
new file mode 100644 (file)
index 0000000..c3d827a
--- /dev/null
@@ -0,0 +1,73 @@
+;; Compatibility functions for emacs 23 and 24 pre 24.4
+
+;; 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.
+
+(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
+
+(provide 'notmuch-compat)
index 2f015b0d29b0d007136b711354f503e9d86f1c62..23bd81c1d0e7251d69506ea0564e5ab489b1c647 100644 (file)
@@ -27,6 +27,7 @@
 (require 'mm-view)
 (require 'mm-decode)
 (require 'cl)
+(require 'notmuch-compat)
 
 (unless (require 'notmuch-version nil t)
   (defconst notmuch-emacs-version "unknown"
index ea75bb9ee8acb722a12b6495d21e333db3f16cbc..a754b60c7ea3d828202b89482cc52c5785cd6599 100644 (file)
@@ -249,7 +249,7 @@ If CREATE is non-nil then create the folder if necessary."
       ;; typo, or just the user want a new folder, let the user decide
       ;; how to deal with it.
       (error
-       (let ((response (read-char-choice
+       (let ((response (notmuch-read-char-choice
                        "Insert failed: (r)etry, (c)reate folder, (i)gnore, or  (e)dit the header? "
                        '(?r ?c ?i ?e))))
         (case response
@@ -335,7 +335,7 @@ if needed."
     ;; fix it in some way.
     (let* ((prompt (format "Fcc %s is not a maildir: (r)etry, (c)reate folder, (i)gnore, or  (e)dit the header? "
                           fcc-header))
-           (response (read-char-choice prompt '(?r ?c ?i ?e))))
+           (response (notmuch-read-char-choice prompt '(?r ?c ?i ?e))))
         (case response
               (?r (notmuch-maildir-fcc-file-fcc fcc-header))
               (?c (if (file-writable-p fcc-header)