emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 0a93fb4 1/2: Set `minibuffer-completion-*` variables locally in m


From: Lars Ingebrigtsen
Subject: master 0a93fb4 1/2: Set `minibuffer-completion-*` variables locally in more places
Date: Thu, 11 Nov 2021 00:44:09 -0500 (EST)

branch: master
commit 0a93fb499b8885ffd87338f1ccc9cb5093f567c1
Author: Miha Rihtaršič <miha@kamnitnik.top>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Set `minibuffer-completion-*` variables locally in more places
    
    * lisp/calc/calc-store.el (calc-read-var-name):
    * lisp/emacs-lisp/crm.el (completing-read-multiple):
    * lisp/progmodes/cc-styles.el (c-read-offset):
    * lisp/window.el (read-buffer-to-switch):
    Set `minibuffer-completion-*` variables buffer-locally instead of
    using a global let-binding (bug#48925).
    
    Follow-up to commit
    2021-05-01 "* lisp/minibuffer.el (completing-read-default): Fix bug#45474"
---
 lisp/calc/calc-store.el     | 15 +++++++++------
 lisp/emacs-lisp/crm.el      | 47 ++++++++++++++++++++++-----------------------
 lisp/progmodes/cc-styles.el | 12 +++++++-----
 lisp/window.el              |  2 +-
 4 files changed, 40 insertions(+), 36 deletions(-)

diff --git a/lisp/calc/calc-store.el b/lisp/calc/calc-store.el
index b396855..de2f18f 100644
--- a/lisp/calc/calc-store.el
+++ b/lisp/calc/calc-store.el
@@ -188,12 +188,15 @@
   (let* ((calc-store-opers store-opers)
          (var (concat
               "var-"
-              (let ((minibuffer-completion-table
-                     (mapcar (lambda (x) (substring x 4))
-                             (all-completions "var-" obarray)))
-                    (minibuffer-completion-predicate
-                     (lambda (x) (boundp (intern (concat "var-" x)))))
-                    (minibuffer-completion-confirm t))
+              (minibuffer-with-setup-hook
+                  (lambda ()
+                    (setq-local minibuffer-completion-table
+                                (mapcar (lambda (x) (substring x 4))
+                                        (all-completions "var-" obarray)))
+                    (setq-local minibuffer-completion-predicate
+                                (lambda (x)
+                                  (boundp (intern (concat "var-" x)))))
+                    (setq-local minibuffer-completion-confirm t))
                 (read-from-minibuffer
                  prompt nil calc-var-name-map nil
                  'calc-read-var-name-history)))))
diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el
index d24ea35..59cbc0e 100644
--- a/lisp/emacs-lisp/crm.el
+++ b/lisp/emacs-lisp/crm.el
@@ -244,30 +244,29 @@ contents of the minibuffer are \"alice,bob,eve\" and 
point is between
 
 This function returns a list of the strings that were read,
 with empty strings removed."
-  (unwind-protect
-      (progn
-       (add-hook 'choose-completion-string-functions
-                 'crm--choose-completion-string)
-       (let* ((minibuffer-completion-table #'crm--collection-fn)
-              (minibuffer-completion-predicate predicate)
-              ;; see completing_read in src/minibuf.c
-              (minibuffer-completion-confirm
-               (unless (eq require-match t) require-match))
-              (crm-completion-table table)
-              (map (if require-match
-                       crm-local-must-match-map
-                     crm-local-completion-map))
-              ;; If the user enters empty input, `read-from-minibuffer'
-              ;; returns the empty string, not DEF.
-              (input (read-from-minibuffer
-                      prompt initial-input map
-                      nil hist def inherit-input-method)))
-         (when (and def (string-equal input ""))
-           (setq input (if (consp def) (car def) def)))
-          ;; Remove empty strings in the list of read strings.
-         (split-string input crm-separator t)))
-    (remove-hook 'choose-completion-string-functions
-                'crm--choose-completion-string)))
+  (let* ((map (if require-match
+                  crm-local-must-match-map
+                crm-local-completion-map))
+         input)
+    (minibuffer-with-setup-hook
+        (lambda ()
+          (add-hook 'choose-completion-string-functions
+                    'crm--choose-completion-string nil 'local)
+          (setq-local minibuffer-completion-table #'crm--collection-fn)
+          (setq-local minibuffer-completion-predicate predicate)
+          ;; see completing_read in src/minibuf.c
+          (setq-local minibuffer-completion-confirm
+                      (unless (eq require-match t) require-match))
+          (setq-local crm-completion-table table))
+      (setq input (read-from-minibuffer
+                   prompt initial-input map
+                   nil hist def inherit-input-method)))
+    ;; If the user enters empty input, `read-from-minibuffer'
+    ;; returns the empty string, not DEF.
+    (when (and def (string-equal input ""))
+      (setq input (if (consp def) (car def) def)))
+    ;; Remove empty strings in the list of read strings.
+    (split-string input crm-separator t)))
 
 ;; testing and debugging
 ;; (defun crm-init-test-environ ()
diff --git a/lisp/progmodes/cc-styles.el b/lisp/progmodes/cc-styles.el
index c6b6be5..4d51883 100644
--- a/lisp/progmodes/cc-styles.el
+++ b/lisp/progmodes/cc-styles.el
@@ -444,17 +444,19 @@ STYLE using `c-set-style' if the optional SET-P flag is 
non-nil."
                          defstr))
         (prompt (concat symname " offset " defstr))
         (keymap (make-sparse-keymap))
-        (minibuffer-completion-table obarray)
-        (minibuffer-completion-predicate 'fboundp)
         offset input)
     ;; In principle completing-read is used here, but SPC is unbound
     ;; to make it less annoying to enter lists.
     (set-keymap-parent keymap minibuffer-local-completion-map)
     (define-key keymap " " 'self-insert-command)
     (while (not offset)
-      (setq input (read-from-minibuffer prompt nil keymap t
-                                       'c-read-offset-history
-                                       (format "%s" oldoff)))
+      (minibuffer-with-setup-hook
+          (lambda ()
+            (setq-local minibuffer-completion-table obarray)
+            (setq-local minibuffer-completion-predicate 'fboundp))
+        (setq input (read-from-minibuffer prompt nil keymap t
+                                          'c-read-offset-history
+                                          (format "%s" oldoff))))
       (if (c-valid-offset input)
          (setq offset input)
        ;; error, but don't signal one, keep trying
diff --git a/lisp/window.el b/lisp/window.el
index 2582743..0f17bb2 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -8574,7 +8574,7 @@ from the list of completions and default values."
   (let ((rbts-completion-table (internal-complete-buffer-except)))
     (minibuffer-with-setup-hook
         (lambda ()
-          (setq minibuffer-completion-table rbts-completion-table)
+          (setq-local minibuffer-completion-table rbts-completion-table)
           ;; Since rbts-completion-table is built dynamically, we
           ;; can't just add it to the default value of
           ;; icomplete-with-completion-tables, so we add it



reply via email to

[Prev in Thread] Current Thread [Next in Thread]