changeset 86131:400e3d52e058

(dired-read-shell-command-default): New function. (dired-read-shell-command): Use its return value for DEFAULT arg.
author Juri Linkov <juri@jurta.org>
date Fri, 16 Nov 2007 01:19:13 +0000
parents e55a87ac8167
children 05bcbc7677d3
files lisp/dired-aux.el
diffstat 1 files changed, 46 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/dired-aux.el	Fri Nov 16 01:18:50 2007 +0000
+++ b/lisp/dired-aux.el	Fri Nov 16 01:19:13 2007 +0000
@@ -463,6 +463,50 @@
 
 ;;; Shell commands
 
+(defun dired-read-shell-command-default (files)
+  "Return a list of default commands for `dired-read-shell-command'."
+  (require 'mailcap)
+  (mailcap-parse-mailcaps)
+  (mailcap-parse-mimetypes)
+  (let* ((all-mime-type
+	  ;; All unique MIME types from file extensions
+	  (delete-dups (mapcar (lambda (file)
+				 (mailcap-extension-to-mime
+				  (file-name-extension file t)))
+			       files)))
+	 (all-mime-info
+	  ;; All MIME info lists
+	  (delete-dups (mapcar (lambda (mime-type)
+				 (mailcap-mime-info mime-type 'all))
+			       all-mime-type)))
+	 (common-mime-info
+	  ;; Intersection of mime-infos from different mime-types;
+	  ;; or just the first MIME info for a single MIME type
+	  (if (cdr all-mime-info)
+	      (delq nil (mapcar (lambda (mi1)
+				  (unless (memq nil (mapcar
+						     (lambda (mi2)
+						       (member mi1 mi2))
+						     (cdr all-mime-info)))
+				    mi1))
+				(car all-mime-info)))
+	    (car all-mime-info)))
+	 (commands
+	  ;; Command strings from `viewer' field of the MIME info
+	  (delq nil (mapcar (lambda (mime-info)
+			      (let ((command (cdr (assoc 'viewer mime-info))))
+				(if (stringp command)
+				    (replace-regexp-in-string
+				     ;; Replace mailcap's `%s' placeholder
+				     ;; with dired's `?' placeholder
+				     "%s" "?"
+				     (replace-regexp-in-string
+				      ;; Remove the final filename placeholder
+				      "\s*\\('\\)?%s\\1?\s*\\'" "" command nil t)
+				     nil t))))
+			    common-mime-info))))
+    commands))
+
 (defun dired-read-shell-command (prompt arg files)
 ;;  "Read a dired shell command prompting with PROMPT (using read-string).
 ;;ARG is the prefix arg and may be used to indicate in the prompt which
@@ -472,7 +516,8 @@
    nil 'shell files
    (function read-string)
    (format prompt (dired-mark-prompt arg files))
-   nil 'shell-command-history))
+   nil 'shell-command-history
+   (dired-read-shell-command-default files)))
 
 ;; The in-background argument is only needed in Emacs 18 where
 ;; shell-command doesn't understand an appended ampersand `&'.