diff lisp/simple.el @ 94251:5e8b311c9c8e

(minibuffer-default-add-shell-commands): New function. Use declare-function for mailcap-file-default-commands from "mailcap". (shell-command): Set local minibuffer-default-add-function to minibuffer-default-add-shell-commands in minibuffer-with-setup-hook before calling read-shell-command. Set 4th arg default-value of read-shell-command to relative buffer-file-name in file buffers.
author Juri Linkov <juri@jurta.org>
date Tue, 22 Apr 2008 19:50:11 +0000
parents 28a10b30dfc6
children f1e8d30ecf61
line wrap: on
line diff
--- a/lisp/simple.el	Tue Apr 22 19:49:26 2008 +0000
+++ b/lisp/simple.el	Tue Apr 22 19:50:11 2008 +0000
@@ -1957,6 +1957,25 @@
 is run interactively.  A value of nil means that output to stderr and
 stdout will be intermixed in the output stream.")
 
+(declare-function mailcap-file-default-commands "mailcap" (files))
+
+(defun minibuffer-default-add-shell-commands ()
+  "Return a list of all commands associted with the current file.
+This function is used to add all related commands retieved by `mailcap'
+to the end of the list of defaults just after the default value."
+  (interactive)
+  (let* ((filename (if (listp minibuffer-default)
+		       (car minibuffer-default)
+		     minibuffer-default))
+	 (commands (and filename (require 'mailcap nil t)
+			(mailcap-file-default-commands (list filename)))))
+    (setq commands (mapcar (lambda (command)
+			     (concat command " " filename))
+			   commands))
+    (if (listp minibuffer-default)
+	(append minibuffer-default commands)
+      (cons minibuffer-default commands))))
+
 (defun minibuffer-complete-shell-command ()
   "Dynamically complete shell command at point."
   (interactive)
@@ -2031,9 +2050,17 @@
 In an interactive call, the variable `shell-command-default-error-buffer'
 specifies the value of ERROR-BUFFER."
 
-  (interactive (list (read-shell-command "Shell command: ")
-		     current-prefix-arg
-		     shell-command-default-error-buffer))
+  (interactive
+   (list
+    (minibuffer-with-setup-hook
+	(lambda ()
+	  (set (make-local-variable 'minibuffer-default-add-function)
+	       'minibuffer-default-add-shell-commands))
+      (read-shell-command "Shell command: " nil nil
+			  (and buffer-file-name
+			       (file-relative-name buffer-file-name))))
+    current-prefix-arg
+    shell-command-default-error-buffer))
   ;; Look for a handler in case default-directory is a remote file name.
   (let ((handler
 	 (find-file-name-handler (directory-file-name default-directory)