GNU bug report logs - #7924
23.2.91; Documentation about CDPATH is a little misleading

Previous Next

Package: emacs;

Reported by: Reuben Thomas <rrt <at> sc3d.org>

Date: Wed, 26 Jan 2011 21:41:02 UTC

Severity: minor

Found in version 23.2.91

Done: Stefan Monnier <monnier <at> IRO.UMontreal.CA>

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 7924 in the body.
You can then email your comments to 7924 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 owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Wed, 26 Jan 2011 21:41:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Reuben Thomas <rrt <at> sc3d.org>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 26 Jan 2011 21:41:02 GMT) Full text and rfc822 format available.

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

From: Reuben Thomas <rrt <at> sc3d.org>
To: bug-gnu-emacs <at> gnu.org
Subject: 23.2.91; Documentation about CDPATH is a little misleading
Date: Wed, 26 Jan 2011 21:48:29 +0000
Both in the manual and in the docstring for `cd', one might reasonably
infer (as I did!) that CDPATH will be searched when completing relative
directory names, but this is not the case.

Is there in fact any way to get this to work? It’s something that one
can do nicely in bash in a terminal, for example, but not in shell-mode.

In any case, it would be nice to lower users’ expectations by pointing
out in the docstring for cd, and in the manual, that it doesn’t apply to
interactive completion.


In GNU Emacs 23.2.91.4 (i686-pc-linux-gnu, GTK+ Version 2.22.0)
 of 2011-01-13 on canta
Windowing system distributor `The X.Org Foundation', version 11.0.10900000
Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_GB.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Emacs-Lisp

Minor modes in effect:
  shell-dirtrack-mode: t
  recentf-mode: t
  show-paren-mode: t
  savehist-mode: t
  minibuffer-electric-default-mode: t
  iswitchb-mode: t
  icomplete-mode: t
  global-whitespace-mode: t
  global-auto-revert-mode: t
  desktop-save-mode: t
  yas/global-mode: t
  yas/minor-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-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
C-b C-b C-b C-b C-b <return> C-x 1 C-n C-n C-n C-n 
C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n 
C-n C-n C-n C-n C-n C-n C-n C-n C-n C-n C-p C-p C-p 
C-p C-p C-p C-p C-p C-p C-p C-p C-p C-p C-p C-p C-p 
C-p C-p C-p C-p C-p C-p C-p C-p C-p C-p C-n C-s C D 
P A T H C-a C-n C-n C-n C-n C-n C-h v c d - p a t h 
<return> C-x b <return> M-x c d <return> <M-backspace> 
<M-backspace> <M-backspace> <M-backspace> <M-backspace> 
<M-backspace> <M-backspace> <M-backspace> <backspace> 
g p <tab> <backspace> r e <backspace> <tab> <tab> <tab> 
<tab> C-g C-x b * s h <return> g r e p SPC c d - p 
a t h S-SPC ~ ? . <backspace> <backspace> / . e m a 
c s . d / * <return> <up> <down> M-p . e l <return> 
M-p <left> <left> <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <left> <left> <left> <left> 
<left> <M-backspace> <M-backspace> C D P A T H <return> 
<up> <down> M-p <backspace> <backspace> <backspace> 
<backspace> <M-backspace> <backspace> <M-backspace> 
d e s <tab> <backspace> <backspace> <backspace> e m 
a c s . d / <backspace> <tab> e e <tab> <backspace> 
s <tab> <return> M-p <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <left> <left> <left> <left> 
<left> <left> <left> <left> <left> <right> <M-backspace> 
c d - p a t h <return> c d SPC g r e p - c <backspace> 
d d <backspace> e c o m p r e s s <return> <help-echo> 
<down-mouse-1> <mouse-1> M-> C-x b <return> C-s r e 
a d - C-a M-x r e p o r t - e m a c s - b u g <ret
urn>

Recent messages:
No completions of ~/.des
Type space to flush; repeat completion command to scroll
No completions of ~/.emacs.dee
Completing file name...
No completions of ~/.emacs.dee
Partially completed
History item: 1
~/repo/grep-decompress 
Mark set
Mark saved where search started

Load-path shadows:
/home/rrt/.emacs.d/elpa/ruby-mode-1.1/ruby-mode hides /usr/share/emacs-snapshot/site-lisp/ruby1.8-elisp/ruby-mode
/home/rrt/local/share/emacs/site-lisp/popup hides /usr/local/share/emacs/23.2.91/site-lisp/auto-complete/popup
/home/rrt/local/share/emacs/site-lisp/fuzzy hides /usr/local/share/emacs/23.2.91/site-lisp/auto-complete/fuzzy
/home/rrt/.emacs.d/elpa/css-mode-1.0/css-mode hides /usr/local/share/emacs/23.2.91/site-lisp/css-mode/css-mode
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/link hides /usr/local/share/emacs/23.2.91/site-lisp/dictionary-el/link
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/connection hides /usr/local/share/emacs/23.2.91/site-lisp/dictionary-el/connection
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/dictionary-init hides /usr/local/share/emacs/23.2.91/site-lisp/dictionary-el/dictionary-init
/home/rrt/.emacs.d/elpa/dictionary-1.8.7/dictionary hides /usr/local/share/emacs/23.2.91/site-lisp/dictionary-el/dictionary
/home/rrt/.emacs.d/elpa/css-mode-1.0/css-mode hides /usr/local/share/emacs/23.2.91/lisp/textmodes/css-mode
/home/rrt/.emacs.d/elpa/ruby-mode-1.1/ruby-mode hides /usr/local/share/emacs/23.2.91/lisp/progmodes/ruby-mode
/home/rrt/.emacs.d/elpa/css-mode-1.0/css-mode hides /usr/share/emacs/site-lisp/css-mode/css-mode
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-info hides /usr/share/emacs/site-lisp/auctex/tex-info
/usr/local/share/emacs/23.2.91/site-lisp/auctex/context-nl hides /usr/share/emacs/site-lisp/auctex/context-nl
/usr/local/share/emacs/23.2.91/site-lisp/auctex/context-en hides /usr/share/emacs/site-lisp/auctex/context-en
/usr/local/share/emacs/23.2.91/site-lisp/auctex/latex hides /usr/share/emacs/site-lisp/auctex/latex
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-mik hides /usr/share/emacs/site-lisp/auctex/tex-mik
/usr/local/share/emacs/23.2.91/site-lisp/dictionary-el/lpath hides /usr/share/emacs/site-lisp/auctex/lpath
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-buf hides /usr/share/emacs/site-lisp/auctex/tex-buf
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-jp hides /usr/share/emacs/site-lisp/auctex/tex-jp
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-bar hides /usr/share/emacs/site-lisp/auctex/tex-bar
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex hides /usr/share/emacs/site-lisp/auctex/tex
/usr/local/share/emacs/23.2.91/site-lisp/auctex/multi-prompt hides /usr/share/emacs/site-lisp/auctex/multi-prompt
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-fptex hides /usr/share/emacs/site-lisp/auctex/tex-fptex
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-font hides /usr/share/emacs/site-lisp/auctex/tex-font
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-fold hides /usr/share/emacs/site-lisp/auctex/tex-fold
/usr/local/share/emacs/23.2.91/site-lisp/auctex/texmathp hides /usr/share/emacs/site-lisp/auctex/texmathp
/usr/local/share/emacs/23.2.91/site-lisp/auctex/context hides /usr/share/emacs/site-lisp/auctex/context
/usr/local/share/emacs/23.2.91/site-lisp/auctex/font-latex hides /usr/share/emacs/site-lisp/auctex/font-latex
/usr/local/share/emacs/23.2.91/site-lisp/auctex/bib-cite hides /usr/share/emacs/site-lisp/auctex/bib-cite
/usr/local/share/emacs/23.2.91/site-lisp/auctex/toolbar-x hides /usr/share/emacs/site-lisp/auctex/toolbar-x
/usr/local/share/emacs/23.2.91/site-lisp/auctex/tex-style hides /usr/share/emacs/site-lisp/auctex/tex-style

Features:
(shadow sort mail-extr message sendmail ecomplete rfc822 mml mml-sec
password-cache mm-decode mm-bodies mm-encode mailcap mail-parse rfc2231
rfc2047 rfc2045 qp ietf-drums mailabbrev nnheader gnus-util netrc
time-date mm-util mail-prsvr gmm-utils mailheader canlock sha1 hex-util
hashcash mail-utils emacsbug multi-isearch find-func pp help-mode
ansi-color shell gud jka-compr info m4-mode autoconf autoconf-mode view
inform-mode noutline outline tex-info texinfo tex sh-script executable
longlines make-mode vc-git face-remap filladapt flyspell completing-help
recentf tree-widget wid-edit uniquify paren savehist minibuf-eldef
iswitchb icomplete whitespace autorevert time cus-start cus-load desktop
server php-mode etags cc-langs cc-mode cc-fonts cc-menus cc-cmds
cc-styles cc-align cc-engine cc-vars cc-defs speedbar sb-image ezimage
dframe lua-mode regexp-opt comint ring ropemacs pymacs etags-update
smart-quotes ispell auto-dictionary-autoloads css-mode-autoloads
dictionary-autoloads diff-git-autoloads dired-isearch-autoloads
full-ack-autoloads guess-style-autoloads http-post-simple-autoloads
js2-mode-autoloads magit-autoloads mv-shell-autoloads
ruby-mode-autoloads package reporter advice advice-preload yasnippet
help-fns derived edmacro kmacro easymenu assoc cl cl-19 muse-autoloads
emacs-goodies-el emacs-goodies-custom emacs-goodies-loaddefs easy-mmode
bbdb-autoloads preview-latex tex-site auto-loads tooltip ediff-hook
vc-hooks lisp-float-type mwheel x-win x-dnd font-setting tool-bar dnd
fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer
select scroll-bar mldrag mouse jit-lock font-lock syntax facemenu
font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan
thai tai-viet lao korean japanese hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese case-table epa-hook
jka-cmpr-hook help simple abbrev loaddefs button minibuffer faces
cus-face files text-properties overlay md5 base64 format env code-pages
mule custom widget hashtable-print-readable backquote
make-network-process dbusbind system-font-setting font-render-setting
gtk x-toolkit x multi-tty emacs)

-- 
http://rrt.sc3d.org/




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Sat, 29 Jan 2011 23:22:02 GMT) Full text and rfc822 format available.

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

From: Chong Yidong <cyd <at> stupidchicken.com>
To: Reuben Thomas <rrt <at> sc3d.org>
Cc: 7924 <at> debbugs.gnu.org
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Sat, 29 Jan 2011 18:29:41 -0500
Reuben Thomas <rrt <at> sc3d.org> writes:

> Both in the manual and in the docstring for `cd', one might reasonably
> infer (as I did!) that CDPATH will be searched when completing relative
> directory names, but this is not the case.
>
> Is there in fact any way to get this to work? It’s something that one
> can do nicely in bash in a terminal, for example, but not in shell-mode.

I think this needs new code in `read-file-name-internal' (the completion
function for read-file-name).




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Sun, 30 Jan 2011 13:27:01 GMT) Full text and rfc822 format available.

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

From: Reuben Thomas <rrt <at> sc3d.org>
To: Chong Yidong <cyd <at> stupidchicken.com>
Cc: 7924 <at> debbugs.gnu.org
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Sun, 30 Jan 2011 13:34:24 +0000
On 29 January 2011 23:29, Chong Yidong <cyd <at> stupidchicken.com> wrote:
> Reuben Thomas <rrt <at> sc3d.org> writes:
>
>> Both in the manual and in the docstring for `cd', one might reasonably
>> infer (as I did!) that CDPATH will be searched when completing relative
>> directory names, but this is not the case.
>>
>> Is there in fact any way to get this to work? It’s something that one
>> can do nicely in bash in a terminal, for example, but not in shell-mode.
>
> I think this needs new code in `read-file-name-internal' (the completion
> function for read-file-name).

Fair enough, but in that case is it worth adding "(this does not work
with filename completion)" to the docstring and manual?

-- 
http://rrt.sc3d.org




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Mon, 31 Jan 2011 04:02:02 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: Chong Yidong <cyd <at> stupidchicken.com>
Cc: 7924 <at> debbugs.gnu.org, Reuben Thomas <rrt <at> sc3d.org>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Sun, 30 Jan 2011 23:09:48 -0500
>> Both in the manual and in the docstring for `cd', one might reasonably
>> infer (as I did!) that CDPATH will be searched when completing relative
>> directory names, but this is not the case.
>> 
>> Is there in fact any way to get this to work? It’s something that one
>> can do nicely in bash in a terminal, for example, but not in shell-mode.

> I think this needs new code in `read-file-name-internal' (the completion
> function for read-file-name).

Indeed, but only for `cd'.  It shouldn't be too hard to do it either,


        Stefan




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Tue, 01 Feb 2011 22:04:02 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
To: Chong Yidong <cyd <at> stupidchicken.com>
Cc: 7924 <at> debbugs.gnu.org, Reuben Thomas <rrt <at> sc3d.org>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Tue, 01 Feb 2011 17:11:52 -0500
>> Both in the manual and in the docstring for `cd', one might reasonably
>> infer (as I did!) that CDPATH will be searched when completing relative
>> directory names, but this is not the case.
>> 
>> Is there in fact any way to get this to work? It’s something that one
>> can do nicely in bash in a terminal, for example, but not in shell-mode.

> I think this needs new code in `read-file-name-internal' (the completion
> function for read-file-name).

The patch below seems to work in my brief testing.


        Stefan


=== modified file 'lisp/files.el'
--- lisp/files.el	2011-02-01 20:53:09 +0000
+++ lisp/files.el	2011-02-01 22:06:43 +0000
@@ -700,25 +700,36 @@
 `path-separator') when resolving a relative directory name.
 The path separator is colon in GNU and GNU-like systems."
   (interactive
-   (list (read-directory-name "Change default directory: "
+   (list
+    ;; FIXME: There's a subtle bug in the completion below.  Seems linked
+    ;; to a fundamental difficulty of implementing `predicate' correctly.
+    ;; The manifestation is that TAB may list non-directories in the case where
+    ;; those files also correspond to valid directories (if your cd-path is (A/
+    ;; B/) and you have A/a a file and B/a a directory, then both `a' and `a/'
+    ;; will be listed as valid completions).
+    ;; This is because `a' (listed because of A/a) is indeed a valid choice
+    ;; (which will lead to the use of B/a).
+    (minibuffer-with-setup-hook
+        (lambda ()
+          (setq minibuffer-completion-table
+                (apply-partially #'locate-file-completion-table
+                                 cd-path nil))
+          (setq minibuffer-completion-predicate
+                (lambda (dir)
+                  (locate-file dir cd-path nil
+                               (lambda (f) (and (file-directory-p f) 'dir-ok))))))
+      (unless cd-path
+        (setq cd-path (or (parse-colon-path (getenv "CDPATH"))
+                          (list "./"))))
+      (read-directory-name "Change default directory: "
 			 default-directory default-directory
-			 (and (member cd-path '(nil ("./")))
-			      (null (getenv "CDPATH"))))))
-  (if (file-name-absolute-p dir)
-      (cd-absolute (expand-file-name dir))
-    (if (null cd-path)
-	(let ((trypath (parse-colon-path (getenv "CDPATH"))))
-	  (setq cd-path (or trypath (list "./")))))
-    (if (not (catch 'found
-	       (mapc
-		(function (lambda (x)
-			    (let ((f (expand-file-name (concat x dir))))
-			      (if (file-directory-p f)
-				  (progn
-				    (cd-absolute f)
-				    (throw 'found t))))))
-		cd-path)
-	       nil))
+                           t))))
+  (unless cd-path
+    (setq cd-path (or (parse-colon-path (getenv "CDPATH"))
+                      (list "./"))))
+  (cd-absolute
+   (or (locate-file dir cd-path nil
+                    (lambda (f) (and (file-directory-p f) 'dir-ok)))
 	(error "No such directory found via CDPATH environment variable"))))
 
 (defun load-file (file)

=== modified file 'src/lread.c'
--- src/lread.c	2011-01-31 18:47:03 +0000
+++ src/lread.c	2011-02-01 21:57:03 +0000
@@ -1223,7 +1223,9 @@
 file name when searching.
 If non-nil, PREDICATE is used instead of `file-readable-p'.
 PREDICATE can also be an integer to pass to the access(2) function,
-in which case file-name-handlers are ignored.  */)
+in which case file-name-handlers are ignored.
+This function will normally skip directories, so if you want it to find
+directories, make sure the PREDICATE function return `dir-ok' for them.  */)
   (Lisp_Object filename, Lisp_Object path, Lisp_Object suffixes, Lisp_Object predicate)
 {
   Lisp_Object file;
@@ -1233,6 +1235,7 @@
   return file;
 }
 
+static Lisp_Object Qdir_ok;
 
 /* Search for a file whose name is STR, looking in directories
    in the Lisp list PATH, and trying suffixes from SUFFIX.
@@ -1350,9 +1353,12 @@
 	      if (NILP (predicate))
 		exists = !NILP (Ffile_readable_p (string));
 	      else
-		exists = !NILP (call1 (predicate, string));
-	      if (exists && !NILP (Ffile_directory_p (string)))
-		exists = 0;
+		{
+		  Lisp_Object tmp = call1 (predicate, string);
+		  exists = !NILP (tmp)
+		    && (EQ (tmp, Qdir_ok)
+			|| !NILP (Ffile_directory_p (string)));
+		}
 
 	      if (exists)
 		{
@@ -4369,6 +4375,9 @@
   Qfile_truename = intern_c_string ("file-truename");
   staticpro (&Qfile_truename) ;
 
+  Qdir_ok = intern_c_string ("dir-ok");
+  staticpro (&Qdir_ok);
+  
   Qdo_after_load_evaluation = intern_c_string ("do-after-load-evaluation");
   staticpro (&Qdo_after_load_evaluation) ;
 





Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Thu, 03 Feb 2011 11:34:01 GMT) Full text and rfc822 format available.

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

From: Reuben Thomas <rrt <at> sc3d.org>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 7924 <at> debbugs.gnu.org, Chong Yidong <cyd <at> stupidchicken.com>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Thu, 3 Feb 2011 11:41:32 +0000
Thanks very much for this Stefan. Unfortunately I can't get emacs head
to build at the moment, and the patch doesn't apply to the emacs-23
branch.




Reply sent to Stefan Monnier <monnier <at> IRO.UMontreal.CA>:
You have taken responsibility. (Fri, 18 Feb 2011 17:28:02 GMT) Full text and rfc822 format available.

Notification sent to Reuben Thomas <rrt <at> sc3d.org>:
bug acknowledged by developer. (Fri, 18 Feb 2011 17:28:03 GMT) Full text and rfc822 format available.

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

From: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
To: Reuben Thomas <rrt <at> sc3d.org>
Cc: 7924-done <at> debbugs.gnu.org, Chong Yidong <cyd <at> stupidchicken.com>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Fri, 18 Feb 2011 12:27:52 -0500
> Thanks very much for this Stefan.  Unfortunately I can't get Emacs's head
> to build at the moment, and the patch doesn't apply to the emacs-23
> branch.

I've installed it to the trunk, thanks.


        Stefan




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#7924; Package emacs. (Tue, 22 Feb 2011 11:26:02 GMT) Full text and rfc822 format available.

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

From: "Andrew W. Nosenko" <andrew.w.nosenko <at> gmail.com>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 7924 <at> debbugs.gnu.org, Chong Yidong <cyd <at> stupidchicken.com>,
	Reuben Thomas <rrt <at> sc3d.org>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Tue, 22 Feb 2011 13:25:16 +0200
On Wed, Feb 2, 2011 at 00:11, Stefan Monnier <monnier <at> iro.umontreal.ca> wrote:
>>> Both in the manual and in the docstring for `cd', one might reasonably
>>> infer (as I did!) that CDPATH will be searched when completing relative
>>> directory names, but this is not the case.
>>>
>>> Is there in fact any way to get this to work? It’s something that one
>>> can do nicely in bash in a terminal, for example, but not in shell-mode.
>
>> I think this needs new code in `read-file-name-internal' (the completion
>> function for read-file-name).
>
> The patch below seems to work in my brief testing.
>
>
>        Stefan
>
>
> === modified file 'lisp/files.el'
> --- lisp/files.el       2011-02-01 20:53:09 +0000
> +++ lisp/files.el       2011-02-01 22:06:43 +0000
> @@ -700,25 +700,36 @@
>  `path-separator') when resolving a relative directory name.
>  The path separator is colon in GNU and GNU-like systems."
>   (interactive
> -   (list (read-directory-name "Change default directory: "
> +   (list
> +    ;; FIXME: There's a subtle bug in the completion below.  Seems linked
> +    ;; to a fundamental difficulty of implementing `predicate' correctly.
> +    ;; The manifestation is that TAB may list non-directories in the case where
> +    ;; those files also correspond to valid directories (if your cd-path is (A/
> +    ;; B/) and you have A/a a file and B/a a directory, then both `a' and `a/'
> +    ;; will be listed as valid completions).
> +    ;; This is because `a' (listed because of A/a) is indeed a valid choice
> +    ;; (which will lead to the use of B/a).
> +    (minibuffer-with-setup-hook
> +        (lambda ()
> +          (setq minibuffer-completion-table
> +                (apply-partially #'locate-file-completion-table
> +                                 cd-path nil))
> +          (setq minibuffer-completion-predicate
> +                (lambda (dir)
> +                  (locate-file dir cd-path nil
> +                               (lambda (f) (and (file-directory-p f) 'dir-ok))))))
> +      (unless cd-path
> +        (setq cd-path (or (parse-colon-path (getenv "CDPATH"))
> +                          (list "./"))))
> +      (read-directory-name "Change default directory: "
>                         default-directory default-directory
> -                        (and (member cd-path '(nil ("./")))
> -                             (null (getenv "CDPATH"))))))
> -  (if (file-name-absolute-p dir)
> -      (cd-absolute (expand-file-name dir))
> -    (if (null cd-path)
> -       (let ((trypath (parse-colon-path (getenv "CDPATH"))))
> -         (setq cd-path (or trypath (list "./")))))
> -    (if (not (catch 'found
> -              (mapc
> -               (function (lambda (x)
> -                           (let ((f (expand-file-name (concat x dir))))
> -                             (if (file-directory-p f)
> -                                 (progn
> -                                   (cd-absolute f)
> -                                   (throw 'found t))))))
> -               cd-path)
> -              nil))
> +                           t))))
> +  (unless cd-path
> +    (setq cd-path (or (parse-colon-path (getenv "CDPATH"))
> +                      (list "./"))))
> +  (cd-absolute
> +   (or (locate-file dir cd-path nil
> +                    (lambda (f) (and (file-directory-p f) 'dir-ok)))
>        (error "No such directory found via CDPATH environment variable"))))
>
>  (defun load-file (file)
>
> === modified file 'src/lread.c'
> --- src/lread.c 2011-01-31 18:47:03 +0000
> +++ src/lread.c 2011-02-01 21:57:03 +0000
> @@ -1223,7 +1223,9 @@
>  file name when searching.
>  If non-nil, PREDICATE is used instead of `file-readable-p'.
>  PREDICATE can also be an integer to pass to the access(2) function,
> -in which case file-name-handlers are ignored.  */)
> +in which case file-name-handlers are ignored.
> +This function will normally skip directories, so if you want it to find
> +directories, make sure the PREDICATE function return `dir-ok' for them.  */)
>   (Lisp_Object filename, Lisp_Object path, Lisp_Object suffixes, Lisp_Object predicate)
>  {
>   Lisp_Object file;
> @@ -1233,6 +1235,7 @@
>   return file;
>  }
>
> +static Lisp_Object Qdir_ok;
>
>  /* Search for a file whose name is STR, looking in directories
>    in the Lisp list PATH, and trying suffixes from SUFFIX.
> @@ -1350,9 +1353,12 @@
>              if (NILP (predicate))
>                exists = !NILP (Ffile_readable_p (string));
>              else
> -               exists = !NILP (call1 (predicate, string));
> -             if (exists && !NILP (Ffile_directory_p (string)))
> -               exists = 0;
> +               {
> +                 Lisp_Object tmp = call1 (predicate, string);
> +                 exists = !NILP (tmp)
> +                   && (EQ (tmp, Qdir_ok)
> +                       || !NILP (Ffile_directory_p (string)));
> +               }
>
>              if (exists)
>                {
> @@ -4369,6 +4375,9 @@
>   Qfile_truename = intern_c_string ("file-truename");
>   staticpro (&Qfile_truename) ;
>
> +  Qdir_ok = intern_c_string ("dir-ok");
> +  staticpro (&Qdir_ok);
> +
>   Qdo_after_load_evaluation = intern_c_string ("do-after-load-evaluation");
>   staticpro (&Qdo_after_load_evaluation) ;
>

This patch breaks spell checking.  Now ispell-word unable to find
installed aspell, tries to use ispell (as fallback?) and fails because
ispell is absent indeed.

    Starting new Ispell process [default] ...
    apply: Searching for program: no such file or directory, ispell


-- 
Andrew W. Nosenko <andrew.w.nosenko <at> gmail.com>




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

From: Stefan Monnier <monnier <at> iro.umontreal.ca>
To: "Andrew W. Nosenko" <andrew.w.nosenko <at> gmail.com>
Cc: 7924-done <at> debbugs.gnu.org, Chong Yidong <cyd <at> stupidchicken.com>,
	Reuben Thomas <rrt <at> sc3d.org>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Tue, 22 Feb 2011 13:15:26 -0500
>>> I think this needs new code in `read-file-name-internal' (the completion
>>> function for read-file-name).
>> 
>> The patch below seems to work in my brief testing.

Indeed, there was a silly typo in the patch.  I believe it is fixed now
(thanks to Wolfgang Jenkner).


        Stefan




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

From: "Andrew W. Nosenko" <andrew.w.nosenko <at> gmail.com>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: 7924-done <at> debbugs.gnu.org, Chong Yidong <cyd <at> stupidchicken.com>,
	Reuben Thomas <rrt <at> sc3d.org>
Subject: Re: bug#7924: 23.2.91;
	Documentation about CDPATH is a little misleading
Date: Wed, 23 Feb 2011 11:15:49 +0200
On Tue, Feb 22, 2011 at 20:15, Stefan Monnier <monnier <at> iro.umontreal.ca> wrote:
>>>> I think this needs new code in `read-file-name-internal' (the completion
>>>> function for read-file-name).
>>>
>>> The patch below seems to work in my brief testing.
>
> Indeed, there was a silly typo in the patch.  I believe it is fixed now
> (thanks to Wolfgang Jenkner).
>

Thanks!  Wolfgang's patch solves problem indeed.

-- 
Andrew W. Nosenko <andrew.w.nosenko <at> gmail.com>




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 23 Mar 2011 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 13 years and 37 days ago.

Previous Next


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