unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons
@ 2017-07-24  3:29 Tino Calancha
  2017-07-24  3:47 ` Drew Adams
  0 siblings, 1 reply; 5+ messages in thread
From: Tino Calancha @ 2017-07-24  3:29 UTC (permalink / raw)
  To: 27801

Severity: wishlist

emacs -Q /tmp

;; Following form shows the full file name in the Dired buffer.
(let* ((dir source-directory)
       (file1 (expand-file-name "lisp/subr.el" dir))
       (file2 (expand-file-name "src/data.c" dir)))
  (dired (list dir file1 file2)))

;; Usually, Dired just shows the relative file name to
;; 'default-directory'.  That is more clear, specially for
;; long file names.

--8<-----------------------------cut here---------------start------------->8---
commit 192c9b0179adbe4ae65d956f064eb9c2197a0a01
Author: Tino Calancha <tino.calancha@gmail.com>
Date:   Mon Jul 24 12:25:24 2017 +0900

    Dired: Use relative file names when DIR-OR-LIST is a cons
    
    * lisp/dired.el (dired-internal-noselect): Use relative file
    names when DIR-OR-LIST is a cons.
    * test/lisp/dired-tests.el (dired-test-bug27801): Add test.

diff --git a/lisp/dired.el b/lisp/dired.el
index 9d500a9f52..718c2b8cf9 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -926,6 +926,11 @@ dired-internal-noselect
 	    ;; if it was the name of a directory at all.
 	    (file-name-directory dirname))
       (or switches (setq switches dired-listing-switches))
+      ;; If `dir-or-list' is a cons, use file names relative
+      ;; to default-directory.
+      (when (and (consp dir-or-list) (file-name-absolute-p (cadr dir-or-list)))
+        (setf (cdr dir-or-list)
+              (mapcar #'file-relative-name (cdr dir-or-list))))
       (if mode (funcall mode)
         (dired-mode dir-or-list switches))
       ;; default-directory and dired-actual-switches are set now
diff --git a/test/lisp/dired-tests.el b/test/lisp/dired-tests.el
index 69331457c0..4241609ec6 100644
--- a/test/lisp/dired-tests.el
+++ b/test/lisp/dired-tests.el
@@ -175,5 +175,25 @@
           (should (looking-at "src")))
       (when (buffer-live-p buf) (kill-buffer buf)))))
 
+(ert-deftest dired-test-bug27801 ()
+  "Test for http://debbugs.gnu.org/27801 ."
+  (let* ((dir (make-temp-file "bug27801" 'dir))
+         (foo (expand-file-name "foo" dir))
+         (bar (expand-file-name "bar" dir))
+         (f1 (expand-file-name "file" foo))
+         (f2 (expand-file-name "file" bar))
+         buf)
+    (unwind-protect
+        (progn
+          (make-directory foo)
+          (make-directory bar)
+          (with-temp-file f1 nil)
+          (with-temp-file f2 nil)
+          (setq buf (dired (list dir f1 f2)))
+          (dired-goto-file f1)
+          (should (looking-at "foo/file$")))
+      (when (buffer-live-p buf) (kill-buffer buf))
+      (delete-directory dir t))))
+
 (provide 'dired-tests)
 ;; dired-tests.el ends here
--8<-----------------------------cut here---------------end--------------->8---
In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.22.11)
 of 2017-07-23
Repository revision: 1f450f1d3531cb53ebe50744c85c90141fce7ad0





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

* bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons
  2017-07-24  3:29 bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons Tino Calancha
@ 2017-07-24  3:47 ` Drew Adams
  2017-07-24  4:16   ` Tino Calancha
  0 siblings, 1 reply; 5+ messages in thread
From: Drew Adams @ 2017-07-24  3:47 UTC (permalink / raw)
  To: Tino Calancha, 27801

> ;; Following form shows the full file name in the Dired buffer.
> (let* ((dir source-directory)
>        (file1 (expand-file-name "lisp/subr.el" dir))
>        (file2 (expand-file-name "src/data.c" dir)))
>   (dired (list dir file1 file2)))
> 
> ;; Usually, Dired just shows the relative file name to
> ;; 'default-directory'.  That is more clear, specially for
> ;; long file names.

Sorry, but I've only read this bug report quickly - no time now.

If you are suggesting that when DIR-OR-LIST is a cons the
file names shown should be relative then I think I disagree
strongly.

The typical use case for a cons DIR-OR-LIST is a list
of files from anywhere, in which case absolute file
names are appropriate.

Again, sorry if I've read too quickly and misunderstood.





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

* bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons
  2017-07-24  3:47 ` Drew Adams
@ 2017-07-24  4:16   ` Tino Calancha
  2017-07-24  5:05     ` Drew Adams
  0 siblings, 1 reply; 5+ messages in thread
From: Tino Calancha @ 2017-07-24  4:16 UTC (permalink / raw)
  To: Drew Adams; +Cc: 27801, Tino Calancha



On Sun, 23 Jul 2017, Drew Adams wrote:

>> ;; Following form shows the full file name in the Dired buffer.
>> (let* ((dir source-directory)
>>        (file1 (expand-file-name "lisp/subr.el" dir))
>>        (file2 (expand-file-name "src/data.c" dir)))
>>   (dired (list dir file1 file2)))
>>
>> ;; Usually, Dired just shows the relative file name to
>> ;; 'default-directory'.  That is more clear, specially for
>> ;; long file names.
>
> Sorry, but I've only read this bug report quickly - no time now.
>
> If you are suggesting that when DIR-OR-LIST is a cons the
> file names shown should be relative then I think I disagree
> strongly.
>
> The typical use case for a cons DIR-OR-LIST is a list
> of files from anywhere, in which case absolute file
> names are appropriate.
I am OK with adding a new variable `foo' so that i can get
this behavior if i locally bind `foo' to a non-nil value.

This idea comes while i am trying to implement Bug#27631; to
have this feature working with 'ls-lisp' my implementation
do something like:

1) Collect all matches with `find-lisp' in a variable FILES.
    (This is just a first approach to the problem; for large
    number of matches would be better to not store the matches
    in a list).

2) [Suppose DIR is the default-directory i the Dired buffer]
    Then call:
(dired (list DIR FILES))

;; My implementation works as with GNU ls; the only difference is
;; that 2) shows full file names in the Dired buffer.  I rather
;; prefer is the output has same format regarless on if the user
;; use `ls-lisp' or not.

With the var `foo' mentioned above, we could change 2) with:
3)

  (let ((foo t))
    (dired (list DIR FILES)))





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

* bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons
  2017-07-24  4:16   ` Tino Calancha
@ 2017-07-24  5:05     ` Drew Adams
  2017-07-24  5:37       ` Tino Calancha
  0 siblings, 1 reply; 5+ messages in thread
From: Drew Adams @ 2017-07-24  5:05 UTC (permalink / raw)
  To: Tino Calancha; +Cc: 27801

> >> ;; Following form shows the full file name in the Dired buffer.
> >> (let* ((dir source-directory)
> >>        (file1 (expand-file-name "lisp/subr.el" dir))
> >>        (file2 (expand-file-name "src/data.c" dir)))
> >>   (dired (list dir file1 file2)))
> >>
> >> ;; Usually, Dired just shows the relative file name to
> >> ;; 'default-directory'. That is more clear, specially for
> >> ;; long file names.
> >
> > Sorry, but I've only read this bug report quickly - no time
> > now.  If you are suggesting that when DIR-OR-LIST is a cons
> > the file names shown should be relative then I think I
> > disagree strongly.
> >
> > The typical use case for a cons DIR-OR-LIST is a list
> > of files from anywhere, in which case absolute file
> > names are appropriate.
>
> I am OK with adding a new variable `foo' so that i can get
> this behavior if i locally bind `foo' to a non-nil value.

I don't see why you need that.

> This idea comes while i am trying to implement Bug#27631; to
> have this feature working with 'ls-lisp' my implementation
> do something like:
> 
> 1) Collect all matches with `find-lisp' in a variable FILES.

(What is `find-lisp'?  I don't see it in Emacs 25.2 or earlier.
But I see 4 functions whose names start with `find-lisp-'.)

>     (This is just a first approach to the problem; for large
>     number of matches would be better to not store the matches
>     in a list).
> 
> 2) [Suppose DIR is the default-directory i the Dired buffer]
>     Then call: (dired (list DIR FILES))
> 
> My implementation works as with GNU ls; the only difference is
> that 2) shows full file names in the Dired buffer.  I rather
> prefer is the output has same format regarless on if the user
> use `ls-lisp' or not.
> 
> With the var `foo' mentioned above, we could change 2) with:
> 3) (let ((foo t)) (dired (list DIR FILES)))

Again, sorry, but I don't really have time to look into this
now.  Two quick comments though, which might be misguided:

1. IIUC, bug #27631 is not a bug.  It is an enhancement request,
for a new feature.  That's not a reason to change a longstanding,
essentially unrelated, behavior that is very general and very
useful.

2. If you call (dired (list DIR FILES)) and you want FILES
to be relative rather than absolute, why can't you just
(for your particular use case) use something like
(dired (list DIR (mapcar #'dired-make-relative FILES)))?
What am I missing?

Possibly you would want to pass DIR or some other directory to
`dired-make-relative' ; dunno.  Or maybe `file-relative-name'
would be more appropriate for your use case; dunno.

I don't understand why you would propose changing `dired'
so that a cons argument is interpreted in some new, more
restrictive way.

I say "more restrictive" because currently you can get
absolute or relative file names, just by passing the
forms of names that you want.  You can even get a mix
of absolute and relative names - that's sometimes handy.

Dired should be able to list file names in either or
both forms.  I see no reason that it shouldn't.

I don't see why you would need to add a variable, as
you describe, instead of just passing the file names
you want in the form(s) that you want.  But I'm probably
missing something in what you're suggesting.





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

* bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons
  2017-07-24  5:05     ` Drew Adams
@ 2017-07-24  5:37       ` Tino Calancha
  0 siblings, 0 replies; 5+ messages in thread
From: Tino Calancha @ 2017-07-24  5:37 UTC (permalink / raw)
  To: 27801-done

Drew Adams <drew.adams@oracle.com> writes:

> 2. If you call (dired (list DIR FILES)) and you want FILES
> to be relative rather than absolute, why can't you just
> (for your particular use case) use something like
> (dired (list DIR (mapcar #'dired-make-relative FILES)))?
> What am I missing?
Your right.  Thank you!
This is the proper way to do it: pass a list with
the relative names.





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

end of thread, other threads:[~2017-07-24  5:37 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-24  3:29 bug#27801: 26.0.50; Dired: Use relative file names when DIR-OR-LIST is a cons Tino Calancha
2017-07-24  3:47 ` Drew Adams
2017-07-24  4:16   ` Tino Calancha
2017-07-24  5:05     ` Drew Adams
2017-07-24  5:37       ` Tino Calancha

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).