GNU bug report logs - #17899
24.3.92.1; dabbrev-completion incorrectly searches all buffers

Previous Next

Package: emacs;

Reported by: Stefan Guath <stefan <at> automata.se>

Date: Wed, 2 Jul 2014 13:56:02 UTC

Severity: normal

Found in versions 23.1, 24.3.92.1

Done: Alan Third <alan <at> idiocy.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 17899 in the body.
You can then email your comments to 17899 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#17899; Package emacs. (Wed, 02 Jul 2014 13:56:05 GMT) Full text and rfc822 format available.

Acknowledgement sent to Stefan Guath <stefan <at> automata.se>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 02 Jul 2014 13:56:07 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Stefan Guath <stefan <at> automata.se>
To: bug-gnu-emacs <at> gnu.org
Subject: 24.3.92.1; dabbrev-completion incorrectly searches all buffers
Date: Wed, 2 Jul 2014 15:54:43 +0200
VERSION:
GNU Emacs 24.3.92.1 (x86_64-apple-darwin13.2.0, NS apple-appkit-1265.20)

TO REPRODUCE BUG:
* emacs -Q
* Create two buffers (C-x b) with the following contents:
foo.el: "idris0 idris1"
bar.el: "ideal0 ideal1"
* Go to end of foo.el, write "id" and execute dabbrev-completion (C-M-/)

EXPECTED RESULT
"id" should complete to "idris". The doc of dabbrev-completion is very clear on this:

"Like M-/ but finds all expansions in the current buffer
and presents suggestions for completion.

With a prefix argument ARG, it searches all buffers accepted by the
function pointed out by `dabbrev-friend-buffer-function' to find the
completions.

If the prefix argument is 16 (which comes from C-u C-u),
then it searches *all* buffers."

No prefix was given here, so it should just look in the current buffer.

ACTUAL RESULT
A new buffer opens with the text:

"In this buffer, type RET to select the completion near point.

Possible completions are:
ideal0                                 ideal1
idris0                                 idris1"

Apparently, the buffer bar.el was incorrectly taken into account. After killing buffer bar.el, dabbrev-completion completes as expected in foo.el.



bug Marked as found in versions 23.1. Request was from Glenn Morris <rgm <at> gnu.org> to control <at> debbugs.gnu.org. (Wed, 02 Jul 2014 17:53:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#17899; Package emacs. (Thu, 03 Jul 2014 11:44:01 GMT) Full text and rfc822 format available.

Message #10 received at 17899 <at> debbugs.gnu.org (full text, mbox):

From: Stefan Guath <stefan <at> automata.se>
To: 17899 <at> debbugs.gnu.org
Subject: Source of bug?
Date: Thu, 3 Jul 2014 13:43:34 +0200
`dabbrev-completion' dynamically binds `dabbrev-check-other-buffers' to the correct value, but later down the call chain (i.e. `dabbrev--find-all-expansions' -> `dabbrev--find-expansion' -> `dabbrev--make-friend-buffer-list'), `dabbrev--make-friend-buffer-list' instead uses the internal `dabbrev--check-other-buffers' which is not updated accordingly. Could this be the source of the error?

/Stefan Guath



Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#17899; Package emacs. (Thu, 05 Dec 2019 13:20:01 GMT) Full text and rfc822 format available.

Message #13 received at 17899 <at> debbugs.gnu.org (full text, mbox):

From: Alan Third <alan <at> idiocy.org>
To: Stefan Guath <stefan <at> automata.se>
Cc: 17899 <at> debbugs.gnu.org
Subject: Re: bug#17899: 24.3.92.1;
 dabbrev-completion incorrectly searches all buffers
Date: Thu, 05 Dec 2019 13:19:13 +0000
[Message part 1 (text/plain, inline)]
Stefan Guath <stefan <at> automata.se> writes:

> TO REPRODUCE BUG:
> * emacs -Q
> * Create two buffers (C-x b) with the following contents:
> foo.el: "idris0 idris1"
> bar.el: "ideal0 ideal1"
> * Go to end of foo.el, write "id" and execute dabbrev-completion (C-M-/)
>
> EXPECTED RESULT
> "id" should complete to "idris".

Hi, sorry it took so long for someone to look at this.

I believe the attached patch fixes it. The problem seems to have been
switching dabbrev.el over to using lexical scoping. It was previously
using let* to temporarily override a couple of global variables, which
works with dynamic scoping, but not lexical.

[0001-Fix-dabbrev-completion-bug-17899.patch (text/x-patch, inline)]
From 40946b12d9583e87b89a3c942ed418990cc35355 Mon Sep 17 00:00:00 2001
From: Alan Third <alan <at> idiocy.org>
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

[Message part 3 (text/plain, inline)]
-- 
Alan Third

Reply sent to Alan Third <alan <at> idiocy.org>:
You have taken responsibility. (Tue, 10 Dec 2019 20:55:02 GMT) Full text and rfc822 format available.

Notification sent to Stefan Guath <stefan <at> automata.se>:
bug acknowledged by developer. (Tue, 10 Dec 2019 20:55:02 GMT) Full text and rfc822 format available.

Message #18 received at 17899-done <at> debbugs.gnu.org (full text, mbox):

From: Alan Third <alan <at> idiocy.org>
To: Stefan Guath <stefan <at> automata.se>
Cc: 17899-done <at> debbugs.gnu.org
Subject: Re: bug#17899: 24.3.92.1; dabbrev-completion incorrectly searches
 all buffers
Date: Tue, 10 Dec 2019 20:54:06 +0000
On Thu, Dec 05, 2019 at 01:19:13PM +0000, Alan Third wrote:
> Stefan Guath <stefan <at> automata.se> writes:
> 
> > TO REPRODUCE BUG:
> > * emacs -Q
> > * Create two buffers (C-x b) with the following contents:
> > foo.el: "idris0 idris1"
> > bar.el: "ideal0 ideal1"
> > * Go to end of foo.el, write "id" and execute dabbrev-completion (C-M-/)
> >
> > EXPECTED RESULT
> > "id" should complete to "idris".
> 
> Hi, sorry it took so long for someone to look at this.
> 
> I believe the attached patch fixes it. The problem seems to have been
> switching dabbrev.el over to using lexical scoping. It was previously
> using let* to temporarily override a couple of global variables, which
> works with dynamic scoping, but not lexical.

I’ve pushed to master and am therefore closing this bug report.
-- 
Alan Third




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 08 Jan 2020 12:24:07 GMT) Full text and rfc822 format available.

This bug report was last modified 5 years and 166 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.