Based upon the name of a file, Dired tries to guess what shell command you might want to apply to it. For example, if you have point on a file named foo.tar and you press !, Dired will guess that you want to run ‘tar xvf’, and suggest that as the default shell command.
You can type M-n to get the default into the minibuffer for editing. If there are several commands for a given file, type M-n several times to see each matching command in order.
Dired only tries to guess a command for a single file, never for a list of marked files.
This variable specifies the predefined rules for guessing shell
commands suitable for certain files. Set this to
nil to turn
guessing off. The elements of
(defined by the user) will override these rules.
nil, this variable specifies the user-defined alist of
file regexps and their suggested commands. These rules take
precedence over the predefined rules in the variable
dired-do-shell-command is run). The default is
Each element of the alist looks like
where each command can either be a string or a Lisp expression that evaluates to a string. If several commands are given, all of them will temporarily be pushed onto the history.
A ‘*’ in the shell command stands for the file name that matched regexp. When Emacs invokes the command, it replaces each instance of ‘*’ with the matched file name.
To add rules for ‘.foo’ and ‘.bar’ file extensions, add this to your Init file:
(setq dired-guess-shell-alist-user (list (list "\\.foo$" "foo-command") ; fixed rule ;; possibly more rules... (list "\\.bar$" ; rule with condition test '(if condition "bar-command-1" "bar-command-2"))))
This will override any predefined rules for the same extensions.
You can find more user options with M-x customize-group RET dired-guess RET.