GNU bug report logs - #41412
27.0.90; Value of default directory in completions buffer

Previous Next

Package: emacs;

Reported by: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>

Date: Tue, 19 May 2020 23:20:02 UTC

Severity: minor

Tags: moreinfo

Merged with 41424

Found in versions 26.1, 27.0.90

Fixed in version 29.1

Done: Lars Ingebrigtsen <larsi <at> gnus.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 41412 in the body.
You can then email your comments to 41412 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#41412; Package emacs. (Tue, 19 May 2020 23:20:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 19 May 2020 23:20:02 GMT) Full text and rfc822 format available.

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

From: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 27.0.90; Value of default directory in completions buffer
Date: Tue, 19 May 2020 16:06:25 -0700
The value of `default-directory' in the completions buffer is wrong when
there is a partial completion inserted in the minibuffer.

Steps to reproduce:

1. Start `emacs -Q'
2. C-x C-f to start finding a file
3. Enter a string (at least one character) and hit tab to pop up the
completions buffer. Let's say this string was "test"
4. The completions buffer will have completions starting with
"test". (We need at least one candidate).
5. C-h v default-directory
6. The value of `default-directory' in the completions buffer is set to
"~/test/", or the current directory + whatever string the user entered
into the minibuffer.


In GNU Emacs 27.0.90 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.13, cairo version 1.17.3)
 of 2020-03-31 built on thinkpad
Repository revision: ac3da1dd9626bc475e78b18c0b438435790e8926
Repository branch: makepkg
Windowing system distributor 'The X.Org Foundation', version 11.0.12008000
System Description: Manjaro Linux

Recent messages:
Making completion list...
Quit [2 times]
Making completion list... [2 times]

Quit
You can run the command ‘load-theme’ with M-x lo-t RET
Use +,-,0 for further adjustment [2 times]
Making completion list...
Type "q" in help window to delete it.
Quit [3 times]
Quit
Configured using:
 'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
 --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games
 --with-sound=alsa --with-modules --without-gconf --without-gsettings
 --with-x-toolkit=gtk3 --without-xaw3d --without-m17n-flt --with-cairo
 --without-compress-install 'CFLAGS=-march=x86-64 -mtune=generic -O2
 -pipe -fstack-protector-strong -fno-plt -g -flto -g -flto -s
 -fuse-ld=gold' CPPFLAGS=-D_FORTIFY_SOURCE=2
 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now'

Configured features:
XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GLIB NOTIFY INOTIFY ACL
LIBSELINUX GNUTLS LIBXML2 FREETYPE HARFBUZZ LIBOTF ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD JSON
PDUMPER LCMS2 GMP

Important settings:
  value of $LC_MONETARY: en_US.UTF-8
  value of $LC_NUMERIC: en_US.UTF-8
  value of $LC_TIME: en_US.UTF-8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  shell-dirtrack-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml mml-sec password-cache epa derived epg epg-config
gnus-util rmail rmail-loaddefs text-property-search mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils face-remap
dichromacy-theme time-date misearch multi-isearch vc-git diff-mode
easy-mmode cl-extra seq byte-opt gv bytecomp byte-compile cconv pp
cl-print mode-local find-func thingatpt help-fns radix-tree help-mode
easymenu shell pcomplete comint ansi-color ring dabbrev embark edmacro
kmacro cl-loaddefs cl-lib pcase subr-x tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win
term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe
tabulated-list replace newcomment text-mode elisp-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame minibuffer cl-generic cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite charscript charprop case-table epa-hook
jka-cmpr-hook help simple abbrev obarray cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote threads dbusbind inotify lcms2 dynamic-setting
font-render-setting cairo move-toolbar gtk x-toolkit x multi-tty
make-network-process emacs)

Memory information:
((conses 16 68828 9827)
 (symbols 48 7742 1)
 (strings 32 23173 2123)
 (string-bytes 1 702281)
 (vectors 16 12996)
 (vector-slots 8 159649 11786)
 (floats 8 46 26)
 (intervals 56 330 0)
 (buffers 1000 17))




Merged 41412 41424. Request was from Glenn Morris <rgm <at> gnu.org> to control <at> debbugs.gnu.org. (Thu, 21 May 2020 16:39:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Fri, 22 Jan 2021 20:29:01 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Omar Antolín Camarena <omar <at> matem.unam.mx>
Cc: 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org,
 Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#41412: 27.0.90; Value of default directory in completions
 buffer
Date: Fri, 22 Jan 2021 21:28:14 +0100
Omar Antolín Camarena <omar <at> matem.unam.mx> writes:

> There is a bit of logic in `complete-setup-function' (from simple.el)
> to set the default directory in the *Completions* buffer:
>
> ;; FIXME: This is a bad hack.  We try to set the default-directory
> ;; in the *Completions* buffer so that the relative file names
> ;; displayed there can be treated as valid file names, independently
> ;; from the completion context.  But this suffers from many problems:
> ;; - It's not clear when the completions are file names.  With some
> ;;   completion tables (e.g. bzr revision specs), the listed
> ;;   completions can mix file names and other things.
> ;; - It doesn't pay attention to possible quoting.
> ;; - With fancy completion styles, the code below will not always
> ;;   find the right base directory.
> (if minibuffer-completing-file-name
>     (file-name-as-directory
>      (expand-file-name
>       (buffer-substring (minibuffer-prompt-end)
>                         (- (point) (or completion-base-size 0))))))
>
> As the comment says, this is brittle, but better than nothing. I
> believe, however, that the `file-name-as-directory' is a typo and
> probably `file-name-directory' was intended instead.

I think that sounds likely.  The patch that introduced this code is
below, and it indeed changes the `file-name-directory' to
`file-name-as-directory' (among other things).

I've added Stafan M to the CCs -- was this done on purpose, or should we
go back to `file-name-directory' here?

diff --git a/lisp/simple.el b/lisp/simple.el
index 082605f659..13c75c4d7b 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -5851,20 +5851,22 @@ completion-root-regexp
 ;; after the text of the completion list buffer is written.
 (defun completion-setup-function ()
   (let* ((mainbuf (current-buffer))
-         (mbuf-contents (minibuffer-completion-contents))
-         common-string-length)
-    ;; When reading a file name in the minibuffer,
-    ;; set default-directory in the minibuffer
-    ;; so it will get copied into the completion list buffer.
-    (if minibuffer-completing-file-name
-	(with-current-buffer mainbuf
-	  (setq default-directory
-                (file-name-directory (expand-file-name mbuf-contents)))))
+         (base-dir
+          ;; When reading a file name in the minibuffer,
+          ;; try and find the right default-directory to set in the
+          ;; completion list buffer.
+          ;; FIXME: Why do we do that, actually?  --Stef
+          (if minibuffer-completing-file-name
+              (file-name-as-directory
+               (expand-file-name
+                (substring (minibuffer-completion-contents)
+                           0 (or completion-base-size 0)))))))
     (with-current-buffer standard-output
       (let ((base-size completion-base-size)) ;Read before killing localvars.
         (completion-list-mode)
         (set (make-local-variable 'completion-base-size) base-size))
       (set (make-local-variable 'completion-reference-buffer) mainbuf)
+      (if base-dir (setq default-directory base-dir))
       (unless completion-base-size
         ;; This shouldn't be needed any more, but further analysis is needed
         ;; to make sure it's the case.


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Fri, 22 Jan 2021 22:51:01 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: Omar Antolín Camarena <omar <at> matem.unam.mx>,
 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org,
 Stefan Kangas <stefankangas <at> gmail.com>
Subject: Re: bug#41412: 27.0.90; Value of default directory in completions
 buffer
Date: Fri, 22 Jan 2021 17:50:18 -0500
> I think that sounds likely.  The patch that introduced this code is
> below, and it indeed changes the `file-name-directory' to
> `file-name-as-directory' (among other things).

But it also changed a fair bit around it.  And the `substring` is quite different.
When I look at the history of this code,
30c7e54299fc81cd3122a17ef130ab69e9855f99 looks wrong.  In order not to
change the behavior, I suspect it should have been:

    (buffer-substring (minibuffer-prompt-end)
                      (+ (minibuffer-prompt-end) (or completion-base-size 0))))))))

and then 326fdb9ec05ab5e4aec0c7064272bb3d223e9875 looks wrong again
since it presumes that `completion-base-size` is nil whereas it usually
isn't/wasn't when completing files.


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Sat, 23 Jan 2021 18:48:02 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: Omar Antolín Camarena <omar <at> matem.unam.mx>,
 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org,
 Stefan Kangas <stefankangas <at> gmail.com>
Subject: Re: bug#41412: 27.0.90; Value of default directory in completions
 buffer
Date: Sat, 23 Jan 2021 19:47:11 +0100
Stefan Monnier <monnier <at> iro.umontreal.ca> writes:

>> I think that sounds likely.  The patch that introduced this code is
>> below, and it indeed changes the `file-name-directory' to
>> `file-name-as-directory' (among other things).
>
> But it also changed a fair bit around it.  And the `substring` is quite different.
> When I look at the history of this code,
> 30c7e54299fc81cd3122a17ef130ab69e9855f99 looks wrong.  In order not to
> change the behavior, I suspect it should have been:
>
>     (buffer-substring (minibuffer-prompt-end)
>                       (+ (minibuffer-prompt-end) (or completion-base-size 0))))))))
>
> and then 326fdb9ec05ab5e4aec0c7064272bb3d223e9875 looks wrong again
> since it presumes that `completion-base-size` is nil whereas it usually
> isn't/wasn't when completing files.

Aha.  But then what would the correct fix now?  I haven't tried the
proposed change (i.e., just change to `file-name-directory'), but it
sounds logical to me.  That is, if the user has typed "~/foo/bar/zo"
then use "~/foo/bar" as the default directory.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Sat, 23 Jan 2021 22:01:02 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: Omar Antolín Camarena <omar <at> matem.unam.mx>,
 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org,
 Stefan Kangas <stefankangas <at> gmail.com>
Subject: Re: bug#41412: 27.0.90; Value of default directory in completions
 buffer
Date: Sat, 23 Jan 2021 17:00:00 -0500
> Aha.  But then what would the correct fix now?  I haven't tried the
> proposed change (i.e., just change to `file-name-directory'), but it
> sounds logical to me.  That is, if the user has typed "~/foo/bar/zo"
> then use "~/foo/bar" as the default directory.

I think the correct thing to do is to look at the `(cdr (last completions))`
where `completions` is what `completion-all-completions` returned.
That gives what used to be called `completion-base-size`.


        Stefan





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Mon, 09 May 2022 11:01:02 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: Omar Antolín Camarena <omar <at> matem.unam.mx>,
 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org,
 Stefan Kangas <stefankangas <at> gmail.com>
Subject: Re: bug#41424: 26.1; default-directory in *Completions* buffer
Date: Mon, 09 May 2022 13:00:13 +0200
Stefan Monnier <monnier <at> iro.umontreal.ca> writes:

> I think the correct thing to do is to look at the `(cdr (last completions))`
> where `completions` is what `completion-all-completions` returned.
> That gives what used to be called `completion-base-size`.

The call sequence here seems to be somewhat convoluted, so I'm not sure
how to get at that.  But wouldn't just doing the following simple patch
fix the issue without regressing anything?


diff --git a/lisp/simple.el b/lisp/simple.el
index 861d9eefde..65b2a482e2 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -9495,9 +9495,11 @@ completion-setup-function
           ;; - With fancy completion styles, the code below will not always
           ;;   find the right base directory.
           (if minibuffer-completing-file-name
-              (file-name-as-directory
-               (expand-file-name
-                (buffer-substring (minibuffer-prompt-end) (point)))))))
+              (let ((file (expand-file-name
+                           (buffer-substring (minibuffer-prompt-end) (point)))))
+                (if (file-directory-p file)
+                    (file-name-as-directory file)
+                  (file-name-directory file))))))
     (with-current-buffer standard-output
       (let ((base-position completion-base-position)
             (base-affixes completion-base-affixes)


-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Added tag(s) moreinfo. Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Mon, 09 May 2022 11:01:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#41412; Package emacs. (Mon, 06 Jun 2022 13:08:01 GMT) Full text and rfc822 format available.

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

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Karthik Chikmagalur <karthikchikmagalur <at> gmail.com>
Cc: 41424 <at> debbugs.gnu.org, 41412 <at> debbugs.gnu.org
Subject: Re: bug#41424: 26.1; default-directory in *Completions* buffer
Date: Mon, 06 Jun 2022 15:07:31 +0200
Karthik Chikmagalur <karthikchikmagalur <at> gmail.com> writes:

> Steps to reproduce:
>
> 1. Start `emacs -Q'
> 2. C-x C-f to start finding a file
> 3. Enter a string (at least one character) and hit tab to pop up the
> completions buffer. Let's say this string was "test"
> 4. The completions buffer will have completions starting with
> "test". (We need at least one candidate).
> 5. C-h v default-directory
> 6. The value of `default-directory' in the completions buffer is set to
> "~/test/", or the current directory + whatever string the user entered
> into the minibuffer.

I can reproduce this in Emacs 28.1, but not in Emacs 29 now (but I could
a month ago), so it seems like this has been fixed recently, and I'm
therefore closing this bug report.  If this problem is still present (it
may be that my test cases doesn't cover all the possibilities), please
respond to the debbugs address and we'll reopen.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




bug marked as fixed in version 29.1, send any further explanations to 41424 <at> debbugs.gnu.org and Omar Antolín Camarena <omar <at> matem.unam.mx> Request was from Lars Ingebrigtsen <larsi <at> gnus.org> to control <at> debbugs.gnu.org. (Mon, 06 Jun 2022 13:08:03 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 05 Jul 2022 11:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 352 days ago.

Previous Next


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