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'?

8 Answers 8

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.

Sign up to request clarification or add additional context in comments.

2 Comments

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")))
i wish i have read through before I tried it. :-) appending & in the end works well
22

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.

4 Comments

At least in Mac OSX, I replaced evince with open, and then it uses the default software (Skim in my case).
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, ... ?
Yes, there is an easy way to change the pdf association without losing the others: M-x customize-group RET openwith RET
In my OS 10.11, after substituting evince with open, PDF files are opened by Preview.
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))) 

1 Comment

This worked nicely. I replace gnome-open with xdg-open, in case of use in another GUI such as KDE.
8

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

1 Comment

And & instead of ! if you want to run that command asynchronously.
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].

1 Comment

This is what I was looking for. Very helpful!
3

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

Comments

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")))) 

Comments

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)))) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.