[PATCH v3] emacs: add compatibility functions for emacs 23
Tomi Ollila
tomi.ollila at iki.fi
Wed Nov 16 09:52:32 PST 2016
On Tue, Nov 15 2016, Mark Walters <markwalters1009 at gmail.com> wrote:
> 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.
> ---
>
> Hi
>
> This is another version of this patch. The previous version is at
> id:1477736487-31319-1-git-send-email-markwalters1009 at gmail.com
>
> The main change is to split out the compatibility functions into a
> separate file.
>
> I haven't moved the defadvice code mentioned in
> id:87mvh4rigu.fsf at tethera.net into this file as that confuses the
> copyright situation (I think that it is all Tomi's code)
LGTM.
Tomi
>
> Best wishes
>
> Mark
>
>
>
>
> emacs/Makefile.local | 1 +
> emacs/notmuch-address.el | 4 +--
> emacs/notmuch-company.el | 3 +-
> emacs/notmuch-compat.el | 73 ++++++++++++++++++++++++++++++++++++++++++++
> emacs/notmuch-lib.el | 1 +
> emacs/notmuch-maildir-fcc.el | 4 +--
> 6 files changed, 81 insertions(+), 5 deletions(-)
> create mode 100644 emacs/notmuch-compat.el
>
> diff --git a/emacs/Makefile.local b/emacs/Makefile.local
> index 6896ff9..442a5e4 100644
> --- a/emacs/Makefile.local
> +++ b/emacs/Makefile.local
> @@ -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 \
> diff --git a/emacs/notmuch-address.el b/emacs/notmuch-address.el
> index 5b2beef..b3c56cf 100644
> --- a/emacs/notmuch-address.el
> +++ b/emacs/notmuch-address.el
> @@ -147,11 +147,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.
> diff --git a/emacs/notmuch-company.el b/emacs/notmuch-company.el
> index b0f9782..ebe2c08 100644
> --- a/emacs/notmuch-company.el
> +++ b/emacs/notmuch-company.el
> @@ -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
> index 0000000..c3d827a
> --- /dev/null
> +++ b/emacs/notmuch-compat.el
> @@ -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)
> diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
> index 1f0d167..5dc6797 100644
> --- a/emacs/notmuch-lib.el
> +++ b/emacs/notmuch-lib.el
> @@ -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"
> diff --git a/emacs/notmuch-maildir-fcc.el b/emacs/notmuch-maildir-fcc.el
> index ea75bb9..a754b60 100644
> --- a/emacs/notmuch-maildir-fcc.el
> +++ b/emacs/notmuch-maildir-fcc.el
> @@ -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)
> --
> 2.1.4
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> https://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list