bug#29513: 25.2; find-dired-centinel

classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5

Following a discussion on help-gnu-emacs

https://lists.gnu.org/archive/html/help-gnu-emacs/2017-11/msg00415.html

I request to replace the function find-dired-sentinel by something
like the following that will sort the output of find
lexicographically.  I have tested that the function below works for me.
Yet there might be corner cases I do not know about where it might fail.

(defun find-dired-sentinel (proc state)
  "Sentinel for \\[find-dired] processes."
  (let ((buf (process-buffer proc)))
    (if (buffer-name buf)
        (with-current-buffer buf
          (let ((inhibit-read-only t))
            (save-excursion
              (save-restriction
                (widen)
                ;; `find-dired-filter' puts two whitespace characters
                ;; at the beginning of every line.
                (narrow-to-region (point) (- (point-max) 2))
                ;; Sort file names lexicographically.
                (sort-subr nil 'forward-line 'end-of-line
                           (lambda ()
                             (buffer-substring-no-properties
                              (next-single-property-change
                               (point) 'dired-filename)
                              (line-end-position))))
                (widen)
                (let ((point (point-max)))
                  (goto-char point)
                  (insert "\n  find "
                          (substring state 0 -1) ; omit \n at end of STATE.
                          " at " (substring (current-time-string) 0 19))
                  (dired-insert-set-properties point (point))))
              (setq mode-line-process
                    (format ":%s" (process-status proc)))
              ;; Since the buffer and mode line will show that the
              ;; process is dead, we can delete it now.  Otherwise it
              ;; will stay around until M-x `list-processes'.
              (delete-process proc)
              (force-mode-line-update))))
          (message "find-dired %s finished." buf))))




In GNU Emacs 25.2.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.18.9)
 of 2017-03-03 built on regnitz
Windowing system distributor 'The X.Org Foundation', version 11.0.11804000
System Description: Ubuntu 16.04.3 LTS

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF
GSETTINGS NOTIFY ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT
LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11

Important settings:
  value of $LC_COLLATE: C
  value of $LANG: en_US.utf8
  value of $XMODIFIERS:
  locale-coding-system: utf-8-unix

Major mode: Dired



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Eli Zaretskii
> Date: Thu, 30 Nov 2017 18:50:22 -0600
> From: "Roland Winkler" <[hidden email]>
>
> Following a discussion on help-gnu-emacs
>
> https://lists.gnu.org/archive/html/help-gnu-emacs/2017-11/msg00415.html
>
> I request to replace the function find-dired-sentinel by something
> like the following that will sort the output of find
> lexicographically.

Thanks.

IMO, if this is deemed a useful feature, it should be optional, as it
will cause files to move on display during the time the shell commands
is running, something that users might find annoying (I certainly
would).



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Michael Heerdegen
In reply to this post by Roland Winkler-5
"Roland Winkler" <[hidden email]> writes:

> Following a discussion on help-gnu-emacs
>
> https://lists.gnu.org/archive/html/help-gnu-emacs/2017-11/msg00415.html
>
> I request to replace the function find-dired-sentinel by something
> like the following that will sort the output of find
> lexicographically.

If we do this - wouldn't supporting other sort predicates also make
sense (e.g. sort by last change time)?


Michael.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Drew Adams
> If we do this - wouldn't supporting other sort predicates also make
> sense (e.g. sort by last change time)?

My thought exactly.  Pretty much anywhere we sort stuff
it makes sense to ask ourselves whether it might be
good to let users specify the sort predicate/order.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
In reply to this post by Eli Zaretskii
On Fri Dec 1 2017 Eli Zaretskii wrote:
> IMO, if this is deemed a useful feature, it should be optional, as it
> will cause files to move on display during the time the shell commands
> is running, something that users might find annoying (I certainly
> would).

In my code, nothing happens while the shell command is running.  The
sorting happens only once when find has finished its job.  But it
would certainly be fine with me to have a user option such as
find-dired-sort for enabling / disabling this feature.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
In reply to this post by Drew Adams
On Fri Dec 1 2017 Drew Adams wrote:
> > If we do this - wouldn't supporting other sort predicates also make
> > sense (e.g. sort by last change time)?
>
> My thought exactly.  Pretty much anywhere we sort stuff
> it makes sense to ask ourselves whether it might be
> good to let users specify the sort predicate/order.

Fine with me, I'd be happy to be able to use such a feature.
The only question is how to achieve that.  The point is that (as far
as I understand these things) something like dired-sort-toggle-or-edit
ultimately relies on the shell command ls to sort its output.

Sorting the output of find by predicates such as last change time
requires to parse its output more carefully.  I believe that
currently dired's parsing capabilities are restricted to identifying
the file name, and my patch for find-dired-sentinel relies on that.

In other words, other predicates require somewhat more work than my
patch.

(All this reminds me of when I wrote proced.el years ago.  Initially
this code relied on the shell command ps that comes with zillions of
flavors on different OSs, which made the code rather fragile.
Things got much cleaner when Eli wrote the built-ins
list-system-processes and process-attributes (thank you Eli!!).  But
I expect that we do not want to re-invent the shell command find for
Emacs.  -- Phrased differently: I do not know how many flavors of
find we may have to cover to sort its output by predicates such as
last change time.)



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Eli Zaretskii
In reply to this post by Roland Winkler-5
> Date: Fri, 1 Dec 2017 10:28:02 -0600
> From: "Roland Winkler" <[hidden email]>
> Cc: [hidden email]
>
> On Fri Dec 1 2017 Eli Zaretskii wrote:
> > IMO, if this is deemed a useful feature, it should be optional, as it
> > will cause files to move on display during the time the shell commands
> > is running, something that users might find annoying (I certainly
> > would).
>
> In my code, nothing happens while the shell command is running.  The
> sorting happens only once when find has finished its job.  But it
> would certainly be fine with me to have a user option such as
> find-dired-sort for enabling / disabling this feature.

Maybe we should simply provide a defcustom, which is a function called
by the sentinel.  Then users could customize what happens after the
files are all collected, be it sort the results or anything else.  The
advantage will be that we won't need to support every possible tweak
of post-processing in core.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Eli Zaretskii
In reply to this post by Roland Winkler-5
> Date: Fri, 1 Dec 2017 11:48:34 -0600
> From: "Roland Winkler" <[hidden email]>
> Cc: Michael Heerdegen <[hidden email]>, [hidden email]
>
> I expect that we do not want to re-invent the shell command find for
> Emacs.

We already have, actually: see find-lisp.el.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
In reply to this post by Eli Zaretskii
On Fri Dec 1 2017 Eli Zaretskii wrote:
> Maybe we should simply provide a defcustom, which is a function called
> by the sentinel.  Then users could customize what happens after the
> files are all collected, be it sort the results or anything else.  The
> advantage will be that we won't need to support every possible tweak
> of post-processing in core.

Again: fine with me.  This could be done such that the *Find* buffer
is narrowed to the portion containing the output of the shell
command (as in my patch).  Also, as a further option (or default
value of the defcustom) we could provide a function that sorts by
file name (thus providing a real-world example of how this new
defcustom can be used).



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
In reply to this post by Eli Zaretskii
> > I expect that we do not want to re-invent the shell command find for
> > Emacs.
>
> We already have, actually: see find-lisp.el.

Interesting, I did not know that.  It seems, though, that the
statement in find-lisp.el

  This is a very generalized form of find.

is not quite accurate.  The power of the shell command find (at
least: the GNU version, which is the only one I know) lies in its
many bells and whistles, whereas find-lisp provides only a subset of
these features.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Eli Zaretskii
> Date: Fri, 1 Dec 2017 14:16:09 -0600
> From: "Roland Winkler" <[hidden email]>
> Cc: [hidden email],
>     [hidden email],
>     [hidden email]
>
> The power of the shell command find (at least: the GNU version,
> which is the only one I know) lies in its many bells and whistles,
> whereas find-lisp provides only a subset of these features.

I'm sure patches to extend its functionality will be most welcome.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
In reply to this post by Roland Winkler-5
On Fri Dec 1 2017 Roland Winkler wrote:

> On Fri Dec 1 2017 Eli Zaretskii wrote:
> > Maybe we should simply provide a defcustom, which is a function called
> > by the sentinel.  Then users could customize what happens after the
> > files are all collected, be it sort the results or anything else.  The
> > advantage will be that we won't need to support every possible tweak
> > of post-processing in core.
>
> Again: fine with me.  This could be done such that the *Find* buffer
> is narrowed to the portion containing the output of the shell
> command (as in my patch).  Also, as a further option (or default
> value of the defcustom) we could provide a function that sorts by
> file name (thus providing a real-world example of how this new
> defcustom can be used).

See commit 249902d5ad5d3ae3e25323c23a2f442913729ceb.



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Noam Postavsky
In reply to this post by Roland Winkler-5
> See commit 249902d5ad5d3ae3e25323c23a2f442913729ceb.

> +(defcustom find-dired-refine-function #'find-dired-sort-by-filename
> +  "If non-nil, a function for refining the *Find* buffer of `find-dired'.

> +                (when (boundp 'find-dired-refine-function)

I think you meant just

    (when find-dired-refine-function

(boundp 'find-dired-refine-function) is always going to be true.

Although you could just drop the "If non-nil" and conditional
altogether: the feature can already be disabled by setting to #'ignore.




Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Roland Winkler-5
On Tue Jun 11 2019 Noam Postavsky wrote:
> > +(defcustom find-dired-refine-function #'find-dired-sort-by-filename
> > +  "If non-nil, a function for refining the *Find* buffer of `find-dired'.
>
> I think you meant just
>
>     (when find-dired-refine-function

Sure, thanks, I should read my doc string.

> Although you could just drop the "If non-nil" and conditional
> altogether: the feature can already be disabled by setting to #'ignore.

Does it make a difference?



Reply | Threaded
Open this post in threaded view
|

bug#29513: 25.2; find-dired-centinel

Noam Postavsky
"Roland Winkler" <[hidden email]> writes:

>> Although you could just drop the "If non-nil" and conditional
>> altogether: the feature can already be disabled by setting to #'ignore.
>
> Does it make a difference?

It makes things just a tiny bit simpler.  Plus, if you really want to
allow nil, you also need to update the defcustom :type field.