diff lisp/dired/dired-guess.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/dired/dired-guess.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,121 @@
+;;; -*- Mode: Emacs-lisp -*- ;;;
+;;; dired-guess.el - In Dired, guess what shell command to apply.
+
+;;; Copyright (C) 1991, 1992 Gregory N. Shapiro
+;;;
+;;; Author:  Gregory N. Shapiro   gshapiro@wpi.wpi.edu
+;;;
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; A copy of the GNU General Public License can be obtained from this
+;;; program's author (send electronic mail to the above address) or from
+;;; Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+;;; This extension to Sebastian Kremer's (sk@thp.Uni-Koeln.DE) Tree-Dired
+;;; permits dired to guess a shell command to use when the user performs
+;;; a shell command on a single file.
+;;;
+;;; New variables (user options):
+;;;    dired-auto-shell-command-alist
+;;;    dired-auto-shell-use-last-extension
+;;;    dired-guess-have-gnutar
+;;;
+;;; Replaces procedures:
+;;;    dired-read-shell-command  (new doc, calls dired-guess-shell-command)
+;;;
+;;; Adds procedures:
+;;;    dired-guess-shell-command  (guesses command by comparing file extensions
+;;;                                to dired-auto-shell-command-alist)
+
+;; LISPDIR ENTRY for the Elisp Archive ===============================
+;;    LCD Archive Entry:
+;;    dired-guess|Gregory N. Shapiro|gshapiro@wpi.wpi.edu
+;;    |Guess a Dired shell command from the filename.
+
+;; INSTALLATION
+;;
+;; Put this file into your load-path and add (load "dired-guess") to
+;; your dired-load-hook, e.g.
+;;
+;; (setq dired-load-hook '(lambda ()
+;; 			  ;; possibly more statements here
+;;			  (load "dired-guess")))
+;;
+;; Note: dired-guess must be loaded after dired-extra.
+;;
+;; If dired-auto-shell-use-last-extension is nil, all file extensions will
+;; be used to determine the command to use.  If nil, use all the
+;; extensions.  For example, foo.tar.Z would guess for the .tar.Z extension.
+;; If non-nil, uses only the last extension of the filename. For example,
+;; foo.tar.Z would use the guess for the .Z extension.
+;;
+;; Set dired-guess-have-gnutar to the name of the GNU tar file (defaults to 
+;; "gnutar").  Set to nil if you don't have GNU tar installed on your system.
+;; GNU tar is available for anonymous ftp at prep.ai.mit.edu.
+
+(defvar dired-guess-have-gnutar "gnutar"
+  "*If non-nil, name of GNU tar (e.g. \"tar\" or \"gnutar\").
+GNU tar's `z' switch is used for compressed tar files.
+If you don't have GNU tar, set this to nil: a pipe is then used.")
+
+(defvar dired-guess-tar (or dired-guess-have-gnutar "tar"))
+
+(defvar dired-auto-shell-command-alist
+  (list
+   '(".Z"     . "uncompress")
+   '(".Z.uu" . "uudecode * | uncompress")
+   '(".uu"    . "uudecode")
+   '(".hqx"   . "mcvert")
+   '(".sh"    . "sh")
+   '(".shar"  . "unshar")
+   (cons ".tar" (concat dired-guess-tar " xvf"))
+   (cons ".tar.Z" (if dired-guess-have-gnutar
+		      (concat dired-guess-tar " xvfz")
+		    (concat "zcat * | " dired-guess-tar " xvf -")))
+   (cons ".tar.Z.uu" (if dired-guess-have-gnutar
+			 (concat "uudecode * | " dired-guess-tar " xvfz -")
+		       "uudecode * | zcat | tar xvf -")))
+
+  "*Alist of file extensions and their suggested commands.
+See also variable `dired-auto-shell-use-last-extension'.")
+
+(defvar dired-auto-shell-use-last-extension nil
+  "*If non-nil, uses only the last extension of the filename.
+  For example, foo.tar.Z would use the guess for the .Z extension.
+If nil, use all the extensions.  For example, foo.tar.Z would guess
+  for the .tar.Z extension.")
+
+(defun dired-read-shell-command (prompt arg files)
+  "Read a dired shell command using generic minibuffer history.
+This command tries to guess a command from the filename(s)
+from the variable `dired-auto-shell-command-alist' (which see)."
+  (dired-mark-pop-up
+   nil 'shell files			; bufname type files
+   'dired-guess-shell-command		; function &rest args
+   (format prompt (dired-mark-prompt arg files)) files))
+
+
+(defun dired-guess-shell-command (prompt files)
+  ;;"Ask user with PROMPT for a shell command, guessing a default from FILES."
+  (let ((defalt (if (cdr files)
+		    nil                 ; If more than one file, don't guess
+		  (cdr (assoc
+			(substring (car files) ; Separate extension & lookup
+				   (if dired-auto-shell-use-last-extension
+				       (string-match "\.[^.]*$" (car files))
+				     (string-match "\\." (car files))))
+			dired-auto-shell-command-alist)))))
+    (if (not (featurep 'gmhist))
+	(read-string prompt defalt)
+      (if defalt
+	  (put 'dired-shell-command-history 'default defalt)))
+    (read-with-history-in 'dired-shell-command-history prompt)))