emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Minibuffer default values list


From: Juri Linkov
Subject: Re: Minibuffer default values list
Date: Mon, 12 Nov 2007 01:42:54 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.50 (gnu/linux)

>> You could put this code in both.  dired-x is not used by most users,
>> so having it only in dired-x is not very useful.
>
> Below is a prototype code that puts commands retrieved by the mailcap
> feature into the default list of the command `!' in Dired.  `M-n' allows
> selecting a command to run.  The default list contains commands common to
> all marked files.  Since mailcap marks the argument placeholder with
> `%s', it's necessary to replace it with `*' used in Dired for the
> same purpose, or remove it at the end of the command.
>
> If this approach is right, before installing in CVS this code could be
> changed to not use cl functions.

Below is a patch ready to install that implements this feature
without using cl functions:

Index: lisp/dired-aux.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/dired-aux.el,v
retrieving revision 1.157
diff -c -r1.157 dired-aux.el
*** lisp/dired-aux.el   9 Nov 2007 09:45:23 -0000       1.157
--- lisp/dired-aux.el   11 Nov 2007 23:41:29 -0000
***************
*** 463,468 ****
--- 498,547 ----
  
  ;;; 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,478 ****
     nil 'shell files
     (function read-string)
     (format prompt (dired-mark-prompt arg files))
!    nil 'shell-command-history))
  
  ;; The in-background argument is only needed in Emacs 18 where
  ;; shell-command doesn't understand an appended ampersand `&'.
--- 551,558 ----
     nil 'shell files
     (function read-string)
     (format prompt (dired-mark-prompt arg files))
!    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 `&'.


-- 
Juri Linkov
http://www.jurta.org/emacs/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]