unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#41424: 26.1; default-directory in *Completions* buffer
@ 2020-05-20 17:49 Omar Antolín Camarena
  2021-01-22 20:28 ` bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer Lars Ingebrigtsen
  0 siblings, 1 reply; 6+ messages in thread
From: Omar Antolín Camarena @ 2020-05-20 17:49 UTC (permalink / raw)
  To: 41424


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.

Say you have a directory ~/foo with files baz and bar. If you are completing file names and have type ~/foo/b the completions are bar and baz. The most useful value for default-directory in the *Completions* buffer would be ~/foo/, but the current code sets it to the non-existent ~/foo/b/ instead. If `complete-setup-function' were changed to use `file-name-directory' instead, then the default-directory would be set to ~/foo/.

Of course, there is no correct default-directory in general. As the comment mentions, sometimes only some of the completions are file names, and even those completions that are file names need not all be in the same directory. But I think this change would make the default-directory useful in many more cases than it currently is: now it basically is only a good guess when what you've type so far is a directory name.

With my suggested fix it's still easy to get useless default-directories. For example with directories:

~/foo: bar baz
~/fez: bing boom

the partial-completion completion style will produce the following completions for ~/f/b:

fez/bing fez/boom foo/bar foo/baz

The most useful default-directory for the *Completions* buffer would be ~/, of course. The current code would give ~/f/b/ and my proposed "fix" would produce ~/f/

To my mind a good compromise would be to ignore all the possible fancy completion tables and focus on behavior that is correct for read-file-name under the partial-completion completion style. (In principle the most reasonable default-directory could be computed from just the contents of the *Completions* buffer, but it might be convenient to "cheat" and use the minibuffer contents, as the current `completion-setup-function' does --and if Emacs does "cheat", it would be good for the cheat to work with partial-completion of paths.)

But the above "good compromise" would take some work that I haven't carefully thought out. I think simply changing `file-name-directory' to `file-name-as-directory' would be a clear improvement with no reason not to do it.


In GNU Emacs 26.1 (build 1, x86_64-pc-linux-gnu, X toolkit, Xaw3d scroll bars)
 of 2019-09-22, modified by Debian built on x86-grnet-01
Windowing system distributor 'The X.Org Foundation', version 11.0.12001000
Recent messages:
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Loading mb-depth...done
Loading minibuf-eldef...done
For information about GNU Emacs and the GNU system, type C-h C-a.
Making completion list... [16 times]

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/lib
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --enable-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --build
 x86_64-linux-gnu --prefix=/usr --sharedstatedir=/var/lib
 --libexecdir=/usr/lib --localstatedir=/var/lib
 --infodir=/usr/share/info --mandir=/usr/share/man --enable-libsystemd
 --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/26.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/26.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --with-x=yes
 --with-x-toolkit=lucid --with-toolkit-scroll-bars --without-gsettings
 'CFLAGS=-g -O2 -fdebug-prefix-map=/build/emacs-StqULU/emacs-26.1+1=.
 -fstack-protector-strong -Wformat -Werror=format-security -Wall'
 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
XAW3D XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS NOTIFY ACL
LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS LUCID X11 THREADS LIBSYSTEMD LCMS2

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

Major mode: Lisp Interaction

Minor modes in effect:
  diff-auto-refine-mode: t
  goto-address-prog-mode: t
  show-paren-mode: t
  electric-pair-mode: t
  beginend-global-mode: t
  beginend-prog-mode: t
  global-dot-mode: t
  dot-mode: t
  global-gobble-whitespace-mode: t
  live-completions-mode: t
  restricto-mode: t
  minibuffer-electric-default-mode: t
  minibuffer-depth-indicate-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-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:
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox hides /usr/share/emacs/26.1/lisp/org/ox
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-texinfo hides /usr/share/emacs/26.1/lisp/org/ox-texinfo
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-publish hides /usr/share/emacs/26.1/lisp/org/ox-publish
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-org hides /usr/share/emacs/26.1/lisp/org/ox-org
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-odt hides /usr/share/emacs/26.1/lisp/org/ox-odt
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-md hides /usr/share/emacs/26.1/lisp/org/ox-md
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-man hides /usr/share/emacs/26.1/lisp/org/ox-man
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-latex hides /usr/share/emacs/26.1/lisp/org/ox-latex
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-icalendar hides /usr/share/emacs/26.1/lisp/org/ox-icalendar
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-html hides /usr/share/emacs/26.1/lisp/org/ox-html
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-beamer hides /usr/share/emacs/26.1/lisp/org/ox-beamer
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ox-ascii hides /usr/share/emacs/26.1/lisp/org/ox-ascii
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org hides /usr/share/emacs/26.1/lisp/org/org
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-timer hides /usr/share/emacs/26.1/lisp/org/org-timer
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-table hides /usr/share/emacs/26.1/lisp/org/org-table
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-src hides /usr/share/emacs/26.1/lisp/org/org-src
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-protocol hides /usr/share/emacs/26.1/lisp/org/org-protocol
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-plot hides /usr/share/emacs/26.1/lisp/org/org-plot
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-pcomplete hides /usr/share/emacs/26.1/lisp/org/org-pcomplete
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-mouse hides /usr/share/emacs/26.1/lisp/org/org-mouse
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-mobile hides /usr/share/emacs/26.1/lisp/org/org-mobile
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-macs hides /usr/share/emacs/26.1/lisp/org/org-macs
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-macro hides /usr/share/emacs/26.1/lisp/org/org-macro
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-list hides /usr/share/emacs/26.1/lisp/org/org-list
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-lint hides /usr/share/emacs/26.1/lisp/org/org-lint
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-inlinetask hides /usr/share/emacs/26.1/lisp/org/org-inlinetask
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-indent hides /usr/share/emacs/26.1/lisp/org/org-indent
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-id hides /usr/share/emacs/26.1/lisp/org/org-id
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-habit hides /usr/share/emacs/26.1/lisp/org/org-habit
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-footnote hides /usr/share/emacs/26.1/lisp/org/org-footnote
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-feed hides /usr/share/emacs/26.1/lisp/org/org-feed
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-faces hides /usr/share/emacs/26.1/lisp/org/org-faces
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-entities hides /usr/share/emacs/26.1/lisp/org/org-entities
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-element hides /usr/share/emacs/26.1/lisp/org/org-element
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-duration hides /usr/share/emacs/26.1/lisp/org/org-duration
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-datetree hides /usr/share/emacs/26.1/lisp/org/org-datetree
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-ctags hides /usr/share/emacs/26.1/lisp/org/org-ctags
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-crypt hides /usr/share/emacs/26.1/lisp/org/org-crypt
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-compat hides /usr/share/emacs/26.1/lisp/org/org-compat
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-colview hides /usr/share/emacs/26.1/lisp/org/org-colview
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-clock hides /usr/share/emacs/26.1/lisp/org/org-clock
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-capture hides /usr/share/emacs/26.1/lisp/org/org-capture
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-attach hides /usr/share/emacs/26.1/lisp/org/org-attach
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-archive hides /usr/share/emacs/26.1/lisp/org/org-archive
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-agenda hides /usr/share/emacs/26.1/lisp/org/org-agenda
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob hides /usr/share/emacs/26.1/lisp/org/ob
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-vala hides /usr/share/emacs/26.1/lisp/org/ob-vala
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-tangle hides /usr/share/emacs/26.1/lisp/org/ob-tangle
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-table hides /usr/share/emacs/26.1/lisp/org/ob-table
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-stan hides /usr/share/emacs/26.1/lisp/org/ob-stan
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-sqlite hides /usr/share/emacs/26.1/lisp/org/ob-sqlite
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-sql hides /usr/share/emacs/26.1/lisp/org/ob-sql
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-shen hides /usr/share/emacs/26.1/lisp/org/ob-shen
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-shell hides /usr/share/emacs/26.1/lisp/org/ob-shell
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-sed hides /usr/share/emacs/26.1/lisp/org/ob-sed
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-screen hides /usr/share/emacs/26.1/lisp/org/ob-screen
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-scheme hides /usr/share/emacs/26.1/lisp/org/ob-scheme
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-sass hides /usr/share/emacs/26.1/lisp/org/ob-sass
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ruby hides /usr/share/emacs/26.1/lisp/org/ob-ruby
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ref hides /usr/share/emacs/26.1/lisp/org/ob-ref
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-python hides /usr/share/emacs/26.1/lisp/org/ob-python
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-processing hides /usr/share/emacs/26.1/lisp/org/ob-processing
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-plantuml hides /usr/share/emacs/26.1/lisp/org/ob-plantuml
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-picolisp hides /usr/share/emacs/26.1/lisp/org/ob-picolisp
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-perl hides /usr/share/emacs/26.1/lisp/org/ob-perl
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-org hides /usr/share/emacs/26.1/lisp/org/ob-org
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-octave hides /usr/share/emacs/26.1/lisp/org/ob-octave
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ocaml hides /usr/share/emacs/26.1/lisp/org/ob-ocaml
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-mscgen hides /usr/share/emacs/26.1/lisp/org/ob-mscgen
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-maxima hides /usr/share/emacs/26.1/lisp/org/ob-maxima
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-matlab hides /usr/share/emacs/26.1/lisp/org/ob-matlab
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-makefile hides /usr/share/emacs/26.1/lisp/org/ob-makefile
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-lua hides /usr/share/emacs/26.1/lisp/org/ob-lua
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-lob hides /usr/share/emacs/26.1/lisp/org/ob-lob
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-lisp hides /usr/share/emacs/26.1/lisp/org/ob-lisp
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-lilypond hides /usr/share/emacs/26.1/lisp/org/ob-lilypond
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ledger hides /usr/share/emacs/26.1/lisp/org/ob-ledger
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-latex hides /usr/share/emacs/26.1/lisp/org/ob-latex
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-js hides /usr/share/emacs/26.1/lisp/org/ob-js
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-java hides /usr/share/emacs/26.1/lisp/org/ob-java
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-io hides /usr/share/emacs/26.1/lisp/org/ob-io
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-hledger hides /usr/share/emacs/26.1/lisp/org/ob-hledger
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-haskell hides /usr/share/emacs/26.1/lisp/org/ob-haskell
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-groovy hides /usr/share/emacs/26.1/lisp/org/ob-groovy
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-gnuplot hides /usr/share/emacs/26.1/lisp/org/ob-gnuplot
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-fortran hides /usr/share/emacs/26.1/lisp/org/ob-fortran
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-forth hides /usr/share/emacs/26.1/lisp/org/ob-forth
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-exp hides /usr/share/emacs/26.1/lisp/org/ob-exp
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-eval hides /usr/share/emacs/26.1/lisp/org/ob-eval
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-emacs-lisp hides /usr/share/emacs/26.1/lisp/org/ob-emacs-lisp
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ebnf hides /usr/share/emacs/26.1/lisp/org/ob-ebnf
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-dot hides /usr/share/emacs/26.1/lisp/org/ob-dot
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-ditaa hides /usr/share/emacs/26.1/lisp/org/ob-ditaa
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-css hides /usr/share/emacs/26.1/lisp/org/ob-css
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-core hides /usr/share/emacs/26.1/lisp/org/ob-core
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-coq hides /usr/share/emacs/26.1/lisp/org/ob-coq
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-comint hides /usr/share/emacs/26.1/lisp/org/ob-comint
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-clojure hides /usr/share/emacs/26.1/lisp/org/ob-clojure
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-calc hides /usr/share/emacs/26.1/lisp/org/ob-calc
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-awk hides /usr/share/emacs/26.1/lisp/org/ob-awk
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-asymptote hides /usr/share/emacs/26.1/lisp/org/ob-asymptote
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-abc hides /usr/share/emacs/26.1/lisp/org/ob-abc
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-R hides /usr/share/emacs/26.1/lisp/org/ob-R
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-J hides /usr/share/emacs/26.1/lisp/org/ob-J
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/ob-C hides /usr/share/emacs/26.1/lisp/org/ob-C
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-version hides /usr/share/emacs/26.1/lisp/org/org-version
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-loaddefs hides /usr/share/emacs/26.1/lisp/org/org-loaddefs
/home/omarantolin/.emacs.d/elpa/org-plus-contrib-20200518/org-install hides /usr/share/emacs/26.1/lisp/org/org-install

Features:
(shadow sort bbdb-message mailalias bbdb-mua bbdb-com crm bbdb bbdb-site
timezone mail-extr misc emacsbug message rmc puny dired dired-loaddefs
format-spec rfc822 mml mml-sec epa derived epg gnus-util rmail
rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mail-utils vc-git diff-mode misc-text find-func goto-addr thingatpt
email-config pdf-loader paren elec-pair ace-link avy ring beginend
dot-mode eval-region-advice gobble-whitespace live-completions regexpect
restricto minibuf-eldef mb-depth completing-history block-undo
modus-vivendi-theme modus-operandi-theme cus-edit cus-start cus-load
wid-edit mm-util mail-prsvr diminish cl-extra help-mode use-package
use-package-ensure use-package-delight use-package-diminish
use-package-bind-key bind-key easy-mmode use-package-core finder-inf
tex-site slime-autoloads info package easymenu epg-config url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache url-vars seq byte-opt gv bytecomp byte-compile cconv
edmacro kmacro cl-loaddefs cl-lib time-date mule-util 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 menu-bar rfn-eshadow isearch timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame 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 minibuffer 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 dbusbind inotify lcms2 dynamic-setting font-render-setting
x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 353481 17018)
 (symbols 48 33822 1)
 (miscs 40 341 103)
 (strings 32 98435 4175)
 (string-bytes 1 2527759)
 (vectors 16 27936)
 (vector-slots 8 678970 15708)
 (floats 8 142 262)
 (intervals 56 325 0)
 (buffers 992 13))





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer
  2020-05-20 17:49 bug#41424: 26.1; default-directory in *Completions* buffer Omar Antolín Camarena
@ 2021-01-22 20:28 ` Lars Ingebrigtsen
  2021-01-22 22:50   ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-22 20:28 UTC (permalink / raw)
  To: Omar Antolín Camarena; +Cc: 41424, 41412, Stefan Monnier

Omar Antolín Camarena <omar@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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

* bug#41412: 27.0.90; Value of default directory in completions buffer
  2021-01-22 20:28 ` bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer Lars Ingebrigtsen
@ 2021-01-22 22:50   ` Stefan Monnier
  2021-01-23 18:47     ` bug#41424: " Lars Ingebrigtsen
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2021-01-22 22:50 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Omar Antolín Camarena, 41424, 41412, Stefan Kangas

> 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






^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer
  2021-01-22 22:50   ` Stefan Monnier
@ 2021-01-23 18:47     ` Lars Ingebrigtsen
  2021-01-23 22:00       ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-23 18:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Omar Antolín Camarena, 41424, 41412, Stefan Kangas

Stefan Monnier <monnier@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





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer
  2021-01-23 18:47     ` bug#41424: " Lars Ingebrigtsen
@ 2021-01-23 22:00       ` Stefan Monnier
  2022-05-09 11:00         ` bug#41412: bug#41424: 26.1; default-directory in *Completions* buffer Lars Ingebrigtsen
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Monnier @ 2021-01-23 22:00 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Omar Antolín Camarena, 41424, 41412, Stefan Kangas

> 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






^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#41412: bug#41424: 26.1; default-directory in *Completions* buffer
  2021-01-23 22:00       ` Stefan Monnier
@ 2022-05-09 11:00         ` Lars Ingebrigtsen
  0 siblings, 0 replies; 6+ messages in thread
From: Lars Ingebrigtsen @ 2022-05-09 11:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Omar Antolín Camarena, 41424, 41412, Stefan Kangas

Stefan Monnier <monnier@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





^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-05-09 11:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-20 17:49 bug#41424: 26.1; default-directory in *Completions* buffer Omar Antolín Camarena
2021-01-22 20:28 ` bug#41424: bug#41412: 27.0.90; Value of default directory in completions buffer Lars Ingebrigtsen
2021-01-22 22:50   ` Stefan Monnier
2021-01-23 18:47     ` bug#41424: " Lars Ingebrigtsen
2021-01-23 22:00       ` Stefan Monnier
2022-05-09 11:00         ` bug#41412: bug#41424: 26.1; default-directory in *Completions* buffer Lars Ingebrigtsen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).