* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
@ 2021-04-27 18:53 Boruch Baum
2021-07-20 14:17 ` Lars Ingebrigtsen
0 siblings, 1 reply; 13+ messages in thread
From: Boruch Baum @ 2021-04-27 18:53 UTC (permalink / raw)
To: 48071
[-- Attachment #1: Type: text/plain, Size: 709 bytes --]
The docstring for dired-guess-default claims it should handle multiple
instances of COMMAND each of which could be a STRING or a FUNCTION which
evaluates to a STRING ...
The attached patch does that. It also weeds out strings that don't represent
valid programs on the host machine.
It turned out that function dired-guess-shell-command wasn't ready for
the multiple responses, so the patch corrects that as well.
My package diredc has an additional feature of an option for a universal
fall-back. My memory is that the emacs developers rejected the idea when
I originally proposed it, so it's not in this patch.
--
hkp://keys.gnupg.net
CA45 09B5 5351 7C11 A9D1 7286 0036 9E45 1595 8BC0
[-- Attachment #2: dired-guess-default.patch --]
[-- Type: text/x-diff, Size: 3800 bytes --]
diff --git a/dired-x.el b/dired-x.el
index 80a266f..d122027 100644
--- a/dired-x.el
+++ b/dired-x.el
@@ -1039,64 +1039,50 @@ REGEXP is matched case-sensitively."
(defun dired-guess-default (files)
"Return a shell command, or a list of commands, appropriate for FILES.
See `dired-guess-shell-alist-user'."
-
(let* ((case-fold-search dired-guess-shell-case-fold-search)
;; Prepend the user's alist to the default alist.
(alist (append dired-guess-shell-alist-user
dired-guess-shell-alist-default))
- (file (car files))
- (flist (cdr files))
elt regexp cmds)
-
- ;; Find the first match in the alist for first file in FILES.
- (while alist
- (setq elt (car alist)
- regexp (car elt)
- alist (cdr alist))
- (if (string-match-p regexp file)
- (setq cmds (cdr elt)
- alist nil)))
-
- ;; If more than one file, see if all of FILES match regular expression.
- (while (and flist
- (string-match-p regexp (car flist)))
- (setq flist (cdr flist)))
-
- ;; If flist is still non-nil, then do not guess since this means that not
- ;; all the files in FILES were matched by the regexp.
- (setq cmds (and (not flist) cmds))
-
- ;; Return commands or nil if flist is still non-nil.
- ;; Evaluate the commands in order that any logical testing will be done.
- (if (cdr cmds)
- (delete-dups (mapcar (lambda (cmd) (eval cmd `((file . ,file)))) cmds))
- (eval (car cmds) `((file . ,file)))))) ; single command
+ (cl-loop
+ for elt in alist
+ do (setq regexp (car elt))
+ (cl-loop
+ for file in files
+ always (string-match-p regexp file)
+ finally
+ (cl-loop
+ for cmd in (cdr elt) do
+ (unless (stringp cmd)
+ (setq cmd (condition-case nil
+ (funcall cmd `((file . ,file)))
+ (error nil))))
+ (and (stringp cmd)
+ (executable-find cmd)
+ (push cmd cmds)))))
+ (nreverse (delete-dups cmds))))
(defun dired-guess-shell-command (prompt files)
"Ask user with PROMPT for a shell command, guessing a default from FILES."
(let ((default (dired-guess-default files))
- default-list val)
+ val)
(if (null default)
;; Nothing to guess
(read-shell-command prompt nil 'dired-shell-command-history)
(setq prompt (replace-regexp-in-string ": $" " " prompt))
- (if (listp default)
+ (if (cdr default)
;; More than one guess
- (setq default-list default
- default (car default)
- prompt (concat
+ (setq prompt (concat
prompt
- (format "{%d guesses} " (length default-list))))
- ;; Just one guess
- (setq default-list (list default)))
+ (format "{%d guesses} " (length default-list)))))
;; Put the first guess in the prompt but not in the initial value.
- (setq prompt (concat prompt (format "[%s]: " default)))
+ (setq prompt (concat prompt (format "[%s]: " (car default))))
;; All guesses can be retrieved with M-n
(setq val (read-shell-command prompt nil
'dired-shell-command-history
- default-list))
+ default))
;; If we got a return, then return default.
- (if (equal val "") default val))))
+ (if (equal val "") (car default) val))))
\f
;;; RELATIVE SYMBOLIC LINKS.
^ permalink raw reply related [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-04-27 18:53 bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH] Boruch Baum
@ 2021-07-20 14:17 ` Lars Ingebrigtsen
2021-07-21 1:53 ` Michael Heerdegen
0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-20 14:17 UTC (permalink / raw)
To: Boruch Baum; +Cc: 48071
Boruch Baum <boruch_baum@gmx.com> writes:
> The docstring for dired-guess-default claims it should handle multiple
> instances of COMMAND each of which could be a STRING or a FUNCTION which
> evaluates to a STRING ...
>
> The attached patch does that. It also weeds out strings that don't represent
> valid programs on the host machine.
I don't think we want to do the latter because of Tramp considerations.
I've now changed dired-guess-default in a somewhat different way than
your patch suggested, but it's functionally similar.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-20 14:17 ` Lars Ingebrigtsen
@ 2021-07-21 1:53 ` Michael Heerdegen
2021-07-21 2:16 ` Michael Heerdegen
2021-07-21 11:12 ` Lars Ingebrigtsen
0 siblings, 2 replies; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-21 1:53 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: Boruch Baum, 48071
Lars Ingebrigtsen <larsi@gnus.org> writes:
> I've now changed dired-guess-default in a somewhat different way than
> your patch suggested, but it's functionally similar.
What happened to the expression case? Have you maybe removed it by
accident (at least it's broken for me now)? See the `eval' calls in the
original code.
These were valid `eval' calls, they allowed to construct commands on the
fly at run time, even specific to the currently given FILE, by
specifying an expression that calculated the command string.
TIA,
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 1:53 ` Michael Heerdegen
@ 2021-07-21 2:16 ` Michael Heerdegen
2021-07-21 11:04 ` Lars Ingebrigtsen
2021-07-21 11:12 ` Lars Ingebrigtsen
1 sibling, 1 reply; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-21 2:16 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: Boruch Baum, 48071
Michael Heerdegen <michael_heerdegen@web.de> writes:
> What happened to the expression case? Have you maybe removed it by
> accident (at least it's broken for me now)? See the `eval' calls in the
> original code.
Other things changed, too: AFAIU now only one file has to match,
originally all had to - correct? That means if I mark 10 files and one
of them is an image, I will get (all) image viewers as guesses.
If this is intended: Should we not at least provide an option to get the
old behavior or sort those matches that match all files first?
TIA,
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 2:16 ` Michael Heerdegen
@ 2021-07-21 11:04 ` Lars Ingebrigtsen
2021-07-21 23:28 ` Michael Heerdegen
0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-21 11:04 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Boruch Baum, 48071
Michael Heerdegen <michael_heerdegen@web.de> writes:
> Other things changed, too: AFAIU now only one file has to match,
> originally all had to - correct? That means if I mark 10 files and one
> of them is an image, I will get (all) image viewers as guesses.
Fixed now.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 1:53 ` Michael Heerdegen
2021-07-21 2:16 ` Michael Heerdegen
@ 2021-07-21 11:12 ` Lars Ingebrigtsen
2021-07-21 23:22 ` Michael Heerdegen
1 sibling, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-21 11:12 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: Boruch Baum, 48071
Michael Heerdegen <michael_heerdegen@web.de> writes:
> What happened to the expression case? Have you maybe removed it by
> accident (at least it's broken for me now)? See the `eval' calls in the
> original code.
Yup; removed by accident. Put back in now, I think.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 11:12 ` Lars Ingebrigtsen
@ 2021-07-21 23:22 ` Michael Heerdegen
0 siblings, 0 replies; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-21 23:22 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: Boruch Baum, 48071
Lars Ingebrigtsen <larsi@gnus.org> writes:
> Yup; removed by accident. Put back in now, I think.
Yes, looks good, thanks -
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 11:04 ` Lars Ingebrigtsen
@ 2021-07-21 23:28 ` Michael Heerdegen
2021-07-22 3:28 ` Michael Heerdegen
2021-07-22 12:10 ` Lars Ingebrigtsen
0 siblings, 2 replies; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-21 23:28 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: 48071-done, Boruch Baum
Lars Ingebrigtsen <larsi@gnus.org> writes:
> Michael Heerdegen <michael_heerdegen@web.de> writes:
>
> > Other things changed, too: AFAIU now only one file has to match,
> > originally all had to - correct?
>
> Fixed now.
Yes - thanks.
So the (only) remaining user visible change is that now all matching
entries are considered instead of only the first one, which is actually
a fix: the docstring of `dired-guess-shell-alist-user' describes it
should work like that.
Ok, I hope we are done then ;-) and: closing again.
Thanks,
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 23:28 ` Michael Heerdegen
@ 2021-07-22 3:28 ` Michael Heerdegen
2021-07-22 12:18 ` Lars Ingebrigtsen
2021-07-22 12:10 ` Lars Ingebrigtsen
1 sibling, 1 reply; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-22 3:28 UTC (permalink / raw)
To: 48071; +Cc: boruch_baum
Michael Heerdegen <michael_heerdegen@web.de> writes:
> Ok, I hope we are done then ;-) and: closing again.
BTW, one more thought: quite a few people might want to configure this
beyond the "adding entries to dired-guess-shell-alist-user" level -
the suggested filtering of not installed executables mentioned in the
original report is one example.
If we bound #'dired-guess-default to a new variable
`dired-guess-default-function' and used the binding of that variable in
the code, it would be easier to do such things, and it would be a tiny
change.
What do you think?
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-21 23:28 ` Michael Heerdegen
2021-07-22 3:28 ` Michael Heerdegen
@ 2021-07-22 12:10 ` Lars Ingebrigtsen
1 sibling, 0 replies; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-22 12:10 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 48071-done, Boruch Baum
Michael Heerdegen <michael_heerdegen@web.de> writes:
> So the (only) remaining user visible change is that now all matching
> entries are considered instead of only the first one, which is actually
> a fix: the docstring of `dired-guess-shell-alist-user' describes it
> should work like that.
Well... does it? It's pretty vague on the issue. And the comments
seem to contradict that:
;; * Parse `dired-guess-shell-alist-user' and
;; `dired-guess-shell-alist-default' (in that order) for the first REGEXP
;; that matches the first file in the file list.
;;
;; * If the REGEXP matches all the entries of the file list then evaluate
;; COMMAND, which is either a string or a Lisp expression returning a
;; string. COMMAND may be a list of commands.
;;
;; * Return this command to `dired-guess-shell-command' which prompts user
;; with it. The list of commands is put into the list of default values.
;; If a command is used successfully then it is stored permanently in
;; `dired-shell-command-history'.
But this is pretty nonsensical -- it describes how the function what
implemented, but not really what to do when the rest of the files don't
match, or when more of them match "the first file".
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-22 3:28 ` Michael Heerdegen
@ 2021-07-22 12:18 ` Lars Ingebrigtsen
2021-07-22 23:21 ` Michael Heerdegen
0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-22 12:18 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: boruch_baum, 48071
Michael Heerdegen <michael_heerdegen@web.de> writes:
> If we bound #'dired-guess-default to a new variable
> `dired-guess-default-function' and used the binding of that variable in
> the code, it would be easier to do such things, and it would be a tiny
> change.
>
> What do you think?
Sure, if you want to... but do people really want to customise the
defaults in Dired to this extent? I haven't really seen much clamouring
for this stuff.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-22 12:18 ` Lars Ingebrigtsen
@ 2021-07-22 23:21 ` Michael Heerdegen
2021-07-23 13:04 ` Lars Ingebrigtsen
0 siblings, 1 reply; 13+ messages in thread
From: Michael Heerdegen @ 2021-07-22 23:21 UTC (permalink / raw)
To: Lars Ingebrigtsen; +Cc: boruch_baum, 48071
Lars Ingebrigtsen <larsi@gnus.org> writes:
> > What do you think?
>
> Sure, if you want to... but do people really want to customise the
> defaults in Dired to this extent? I haven't really seen much
> clamouring for this stuff.
I think this is partly because doing this is such an unpleasant and
byzantine thing to do. But I also have package developers in mind.
Michael.
^ permalink raw reply [flat|nested] 13+ messages in thread
* bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH]
2021-07-22 23:21 ` Michael Heerdegen
@ 2021-07-23 13:04 ` Lars Ingebrigtsen
0 siblings, 0 replies; 13+ messages in thread
From: Lars Ingebrigtsen @ 2021-07-23 13:04 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: boruch_baum, 48071
Michael Heerdegen <michael_heerdegen@web.de> writes:
>> Sure, if you want to... but do people really want to customise the
>> defaults in Dired to this extent? I haven't really seen much
>> clamouring for this stuff.
>
> I think this is partly because doing this is such an unpleasant and
> byzantine thing to do. But I also have package developers in mind.
Sure; I'm not against adding it if you feel it would be useful.
--
(domestic pets only, the antidote for overdose, milk.)
bloggy blog: http://lars.ingebrigtsen.no
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2021-07-23 13:04 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-27 18:53 bug#48071: 28.0.50: dired-guess-default: comply with docstring options [PATCH] Boruch Baum
2021-07-20 14:17 ` Lars Ingebrigtsen
2021-07-21 1:53 ` Michael Heerdegen
2021-07-21 2:16 ` Michael Heerdegen
2021-07-21 11:04 ` Lars Ingebrigtsen
2021-07-21 23:28 ` Michael Heerdegen
2021-07-22 3:28 ` Michael Heerdegen
2021-07-22 12:18 ` Lars Ingebrigtsen
2021-07-22 23:21 ` Michael Heerdegen
2021-07-23 13:04 ` Lars Ingebrigtsen
2021-07-22 12:10 ` Lars Ingebrigtsen
2021-07-21 11:12 ` Lars Ingebrigtsen
2021-07-21 23:22 ` Michael Heerdegen
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).