openwith
seems to kill replying in mu4e
.
Is there a similar/alternative solution for easy defining default apps per extensions in dired
?
openwith
seems to kill replying in mu4e
.
Is there a similar/alternative solution for easy defining default apps per extensions in dired
?
On Debian, this is how I do it:
(defun mu-open-in-external-app ()
"Open the file where point is or the marked files in Dired in external
app. The app is chosen from your OS's preference."
(interactive)
(let* ((file-list
(dired-get-marked-files)))
(mapc
(lambda (file-path)
(let ((process-connection-type nil))
(start-process "" nil "xdg-open" file-path))) file-list)))
And then I have this:
(define-key dired-mode-map (kbd "C-<return>") #'mu-open-in-external-app)
You can bind RET
instead.
(define-key dired-mode-map (kbd "RET") #'mu-open-in-external-app)
Yes, vanilla Dired has help for this, and Dired+ provides some more help.
You can use !
on a file (or marked files) to run a shell program on it. Use M-n
to cycle among possible commands. These commands to choose from come from the MIME type of the file (see non-option variable mailcap-mime-data
). They can also come from entries that you make in user option dired-guess-shell-alist-user
(you will need to load standard library dired-x.el
for this).
If you use Emacs on MS Windows and you have both Dired+ and library w32-browser.el
(see Ms Shell Execute) then you can use M-RET
in Dired to open a file or directory using its Windows file association (i.e., its "open" program).
You might find that dired-launch is of some value. I developed it as a launcher specifically for dired-mode (unlike openwith
... which tries to work in a variety of settings). dired-launch
provides a keybinding (J
) which allows one to launch the default external application corresponding to that file.
I'd like to expand on Manuel Uberti's answer.
I use EWXM, and I don't want to accidentally open another Emacs instance. Before running xdg-open
, I first run xdg-mime
a couple of times to check whether the application that will open the file is Emacs. If it is, skip the current file.
I'm new to Elisp, and I appreciate suggestions for improvement!
;;;###autoload
(defun my/open-in-external-app ()
"Open the file where point is or the marked files in Dired in external
app. The app is chosen from your OS's preference."
(interactive)
(mapc
(lambda (file-path)
(let* ((mime-type (string-trim (shell-command-to-string (concat "xdg-mime query filetype '" file-path "'"))))
(default-application (string-trim (shell-command-to-string (concat "xdg-mime query default " mime-type)))))
(unless (equal default-application "emacs.desktop")
(let ((process-connection-type nil))
(start-process "" nil "xdg-open" file-path)))))
(dired-get-marked-files)))
One more thing: When I attempted to load the define-key
sexp on startup, I got an error about dired-mode-map
being unbound. So I wrapped it with with-eval-after-load
:
(with-eval-after-load 'dired
(define-key dired-mode-map (kbd "C-<return>") #'my/open-in-external-app))