How can I open files externally in Emacs dired mode?
Asked Answered
A

8

41

I want to open a pdf with evince instead of DocView mode. Is there a possibility to open a file with a specific command like 'evince'?

Antonetteantoni answered 27/7, 2011 at 13:20 Comment(0)
S
40

Yes. Use ! while in dired to run a shell command on a file.

In the case of evince, it's smarter to use &, though, which will run the command asynchronously, so emacs will still be usable while you have the PDF open.

Sevier answered 27/7, 2011 at 13:24 Comment(2)
Note that you can customize the default command used by ! via dired-guess-shell-alist-user from dired-x: (setq dired-guess-shell-alist-user '(("\\.pdf\\'" "evince")))Isochronize
i wish i have read through before I tried it. :-) appending & in the end works wellVulcanize
R
21

There is more then one way to do that. I suggest OpenWith library. Setup for your case may look like that:

(add-to-list 'load-path "/path/to/downloaded/openwith.el")
(require 'openwith)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
(openwith-mode t)

It sets file handler that will work from both dired and find-file.

Ryals answered 27/7, 2011 at 13:50 Comment(4)
At least in Mac OSX, I replaced evince with open, and then it uses the default software (Skim in my case).Villeinage
Note that in this case you would just hit RET on the file name in dired instead of using ! or & to run a shell command. You also lose all the built in associations by using setq on openwith-associations. Might there be a better way to change only the pdf association while leaving in associations for .mp3, .jpg, ... ?Myosin
Yes, there is an easy way to change the pdf association without losing the others: M-x customize-group RET openwith RETEggcup
In my OS 10.11, after substituting evince with open, PDF files are opened by Preview.Gastritis
S
11

Try this.

(defun dired-open-file ()
  "In dired, open the file named on this line."
  (interactive)
  (let* ((file (dired-get-filename nil t)))
    (message "Opening %s..." file)
    (call-process "gnome-open" nil 0 nil file)
    (message "Opening %s done" file)))
Simpatico answered 28/7, 2011 at 2:57 Comment(1)
This worked nicely. I replace gnome-open with xdg-open, in case of use in another GUI such as KDE.Appanage
V
8

You can use ! to open the file and then specify a command.

Vasti answered 27/7, 2011 at 13:24 Comment(1)
And & instead of ! if you want to run that command asynchronously.Harping
S
6

Note that you can keep the process alive after exiting Emacs by using nohup [Wikipedia], so put the point on a single file in dired:

C-u ! nohup evince ? &

which creates a Persistent Processes [EmacsWiki].

Stephi answered 17/9, 2011 at 0:41 Comment(1)
This is what I was looking for. Very helpful!Saito
G
3

In Windows, I offen use ! and command "explorer" to open PDF/Word/Excel...

Goode answered 14/11, 2014 at 6:4 Comment(0)
N
1

Another windows OS solution using explorer.exe to open single/multiple files. To open multiple files, mark the file using m in dired and then hit o to open multiple files. To just open a single file under point hit o. I have tested it in Emacs 28.2 GUI running natively on windows (no WSL/Cygwin/Linux-on-Windows).

  (use-package dired
      :bind (:map dired-mode-map
          ("o" . jr/dired-open))
      :config
      (defun jr/dired-open ()
      (interactive)
      (if-let ((marks (dired-get-marked-files)))
        (dolist (file marks)
          (shell-command (format "explorer.exe %s" (file-name-nondirectory file))))
      (user-error "No marked files; aborting"))))
Nereid answered 14/5, 2023 at 6:49 Comment(0)
B
0
(defun dired-open()
  (interactive)
  (setq file (dired-get-file-for-visit))
  (setq ext (file-name-extension file))
  (cond ((string= ext "pdf")
         ;; shell-quote-argument escapes white spaces on the file name
         (async-shell-command (concat "zathura " (shell-quote-argument file))))
        ((string= ext "epub")
         (async-shell-command (concat "zathura " (shell-quote-argument file))))
        ((string= ext "rar")
         (async-shell-command (concat "file-roller " (shell-quote-argument file))))
        ((string= ext "zip")
         (async-shell-command (concat "file-roller " (shell-quote-argument file))))
        (t (dired-find-file))))
Brough answered 21/2, 2020 at 7:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.