[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