From 40946b12d9583e87b89a3c942ed418990cc35355 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Thu, 5 Dec 2019 13:14:00 +0000 Subject: [PATCH] Fix dabbrev-completion (bug#17899) * lisp/dabbrev.el (dabbrev--check-all-buffers): Add new variable. (dabbrev-completion): Lexical scoping means we can't use let to override global variables, so use setq. (dabbrev--reset-global-variables): Reset new variable. (dabbrev--make-friend-buffer-list): Use new variable. * test/lisp/dabbrev-tests.el (dabbrev-completion-test): (dabbrev-completion-test-with-argument): New tests. --- lisp/dabbrev.el | 16 ++++++++++------ test/lisp/dabbrev-tests.el | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lisp/dabbrev.el b/lisp/dabbrev.el index 23abe7ae16..0cb9b0b824 100644 --- a/lisp/dabbrev.el +++ b/lisp/dabbrev.el @@ -323,6 +323,9 @@ dabbrev--last-case-pattern ;; Same as dabbrev-check-other-buffers, but is set for every expand. (defvar dabbrev--check-other-buffers dabbrev-check-other-buffers) +;; Same as dabbrev-check-all-buffers, but is set for every expand. +(defvar dabbrev--check-all-buffers dabbrev-check-all-buffers) + ;; The regexp for recognizing a character in an abbreviation. (defvar dabbrev--abbrev-char-regexp nil) @@ -380,10 +383,7 @@ dabbrev-completion then it searches *all* buffers." (interactive "*P") (dabbrev--reset-global-variables) - (let* ((dabbrev-check-other-buffers (and arg t)) - (dabbrev-check-all-buffers - (and arg (= (prefix-numeric-value arg) 16))) - (abbrev (dabbrev--abbrev-at-point)) + (let* ((abbrev (dabbrev--abbrev-at-point)) (beg (progn (search-backward abbrev) (point))) (end (progn (search-forward abbrev) (point))) (ignore-case-p (dabbrev--ignore-case-p abbrev)) @@ -420,6 +420,9 @@ dabbrev-completion (t (mapcar #'downcase completion-list))))))) (complete-with-action a list s p))))) + (setq dabbrev--check-other-buffers (and arg t)) + (setq dabbrev--check-all-buffers + (and arg (= (prefix-numeric-value arg) 16))) (completion-in-region beg end table))) ;;;###autoload @@ -623,7 +626,8 @@ dabbrev--reset-global-variables dabbrev--last-buffer-found nil dabbrev--abbrev-char-regexp (or dabbrev-abbrev-char-regexp "\\sw\\|\\s_") - dabbrev--check-other-buffers dabbrev-check-other-buffers)) + dabbrev--check-other-buffers dabbrev-check-other-buffers + dabbrev--check-all-buffers dabbrev-check-all-buffers)) (defun dabbrev--select-buffers () "Return a list of other buffers to search for a possible abbrev. @@ -772,7 +776,7 @@ dabbrev--make-friend-buffer-list ;; If dabbrev-check-all-buffers, tack on all the other ;; buffers at the end of the list, except those which are ;; specifically to be ignored. - (if dabbrev-check-all-buffers + (if dabbrev--check-all-buffers (setq list (append list (dabbrev-filter-elements diff --git a/test/lisp/dabbrev-tests.el b/test/lisp/dabbrev-tests.el index a6ab2e7201..d26362db3d 100644 --- a/test/lisp/dabbrev-tests.el +++ b/test/lisp/dabbrev-tests.el @@ -40,3 +40,33 @@ dabbrev-expand-test ;; M-/ SPC M-/ M-/ (execute-kbd-macro "\257 \257\257")) (should (string= (buffer-string) "ab x\nab y\nab y")))) + +(ert-deftest dabbrev-completion-test () + "Test for bug#17899. +dabbrev-completion should not look for expansions in other +buffers unless a prefix argument is used." + (with-temp-buffer + (insert "axy") + (with-temp-buffer + (insert "abc\na") + (goto-char 6) + (save-window-excursion + (set-window-buffer nil (current-buffer)) + ;; C-M-/ + (execute-kbd-macro [201326639])) + (should (string= (buffer-string) "abc\nabc"))))) + +(ert-deftest dabbrev-completion-test-with-argument () + "Test for bug#17899. +dabbrev-completion should not complete because it has found +multiple expansions." + (with-temp-buffer + (insert "axy") + (with-temp-buffer + (insert "abc\na") + (goto-char 6) + (save-window-excursion + (set-window-buffer nil (current-buffer)) + ;; C-u C-u C-M-/ + (execute-kbd-macro [21 21 201326639])) + (should (string= (buffer-string) "abc\na"))))) -- 2.21.0