Como posso adicionar comandos shell padrão para vários tipos de arquivo?

7

Quando uso !em um *.tar.bz2arquivo no Dired, recebo o seguinte prompt:

! on WANem_3.0_Beta2.tar.bz2: {3 guesses} [bunzip2 -c * | tar xvf -] -!-

Como posso adicionar funcionalidades semelhantes para outros tipos de arquivos?

Sean Allred
fonte
11
Ligeiramente
abo-abo
@ abo-abo puro !!
Sean Allred

Respostas:

7

TL; DR:

Essa funcionalidade vem dired-x, não Dired. Use (require 'dired-x)no seu arquivo init e depois personalize dired-guess-shell-alist-user.


Podemos ver, porém, onde Dired se conecta dired-x:

(defun dired-read-shell-command (prompt arg files)
  "Read a dired shell command.
PROMPT should be a format string with one \"%s\" format sequence,
which is replaced by the value returned by `dired-mark-prompt',
with ARG and FILES as its arguments.  FILES should be a list of
file names.  The result is used as the prompt.

This normally reads using `read-shell-command', but if the
`dired-x' package is loaded, use `dired-guess-shell-command' to
offer a smarter default choice of shell command."
  (minibuffer-with-setup-hook
      (lambda ()
    (set (make-local-variable 'minibuffer-default-add-function)
         'minibuffer-default-add-dired-shell-commands))
    (setq prompt (format prompt (dired-mark-prompt arg files)))
    (if (functionp 'dired-guess-shell-command) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<
    (dired-mark-pop-up nil 'shell files
               'dired-guess-shell-command prompt files)
      (dired-mark-pop-up nil 'shell files
             'read-shell-command prompt nil nil))))

Depois de ler o dired-xmanual (info "dired-x"), você aprende sobre a variável dired-guess-shell-alist-user, que você pode personalizar.

Aqui está um exemplo de mudança dired-guess-shell-alist-user

(setq dired-guess-shell-alist-user
      '(("\\.e?ps$" "gv" "xloadimage" "lpr")
        ("\\.chm$" "xchm")
        ("\\.rar$" "unrar x")
        ("\\.e?ps\\.g?z$" "gunzip -qc * | gv -")
        ("\\.pdf$" "zathura")
        ("\\.flv$" "mplayer")
        ("\\.mov$" "mplayer")
        ("\\.3gp$" "mplayer")
        ("\\.png$" "feh")
        ("\\.jpg$" "feh")
        ("\\.JPG$" "feh")
        ("\\.avi$" "mplayer")))
Sean Allred
fonte
2
Em suma: (require 'dired-x)e personalize dired-guess-shell-alist-user. ;-)
Drew
@ Drew Eu me sentiria mal por postar uma resposta tão curta! XD Eu vou adicionar seu TL; DR :)
Sean Allred
Não quis dizer esse comentário como um substituto para sua resposta mais completa.
Drew
@ Drew :) Mas você faz um bom argumento - não foi fácil obter 'a resposta' da minha resposta. Eu preciso praticar um pouco a minha escrita; Essa é uma das razões pelas quais eu estou aqui :)
Sean Allred
11
Boa. Desejar se comunicar melhor mostra o quanto você está tentando ajudar as pessoas.
Drew