From c175ad52faae49a10a7c04c79a7ca88d68c551b4 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 20 Jul 2021 16:16:09 +0200 Subject: [PATCH] Make dired-guess-default return all matching programs * lisp/dired-x.el (dired-guess-default): Return all matching programs (bug#48071). --- lisp/dired-x.el | 46 +++++++++++++------------------------- test/lisp/dired-x-tests.el | 12 ++++++++++ 2 files changed, 27 insertions(+), 31 deletions(-) diff --git a/lisp/dired-x.el b/lisp/dired-x.el index 8d99d1a21c6..2d91b5a9e8d 100644 --- a/lisp/dired-x.el +++ b/lisp/dired-x.el @@ -972,38 +972,22 @@ 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 + (programs + (delete-dups + (seq-reduce + #'append + (mapcar #'cdr + (seq-filter (lambda (elem) + (seq-some (lambda (file) + (string-match-p (car elem) file)) + files)) + (append dired-guess-shell-alist-user + dired-guess-shell-alist-default))) + nil)))) + (if (length= programs 1) + (car programs) + programs))) (defun dired-guess-shell-command (prompt files) "Ask user with PROMPT for a shell command, guessing a default from FILES." diff --git a/test/lisp/dired-x-tests.el b/test/lisp/dired-x-tests.el index 5b51c997e36..98754b19b4e 100644 --- a/test/lisp/dired-x-tests.el +++ b/test/lisp/dired-x-tests.el @@ -49,5 +49,17 @@ (sort (dired-get-marked-files 'local) #'string<)))) (delete-directory dir 'recursive)))) +(ert-deftest dired-guess-default () + (let ((dired-guess-shell-alist-user nil) + (dired-guess-shell-alist-default + '(("\\.png\\'" "display") + ("\\.gif\\'" "display" "xloadimage") + ("\\.gif\\'" "feh") + ("\\.jpe?g\\'" "xloadimage")))) + (should (equal (dired-guess-default '("/tmp/foo.png")) "display")) + (should (equal (dired-guess-default '("/tmp/foo.gif")) + '("display" "xloadimage" "feh"))))) + + (provide 'dired-x-tests) ;; dired-x-tests.el ends here -- 2.39.2