2

openwith seems to kill replying in mu4e.

Is there a similar/alternative solution for easy defining default apps per extensions in dired?

Dan
  • 32,584
  • 6
  • 98
  • 168
zeltak
  • 1,685
  • 11
  • 25
  • Can you clarify what you mean when you say that "`openwith` seems to kill replying in `mu4e`"? I use both and have no problem with them. Does this problem persist if you start Emacs without your init file (`emacs -Q`)? – Dan Apr 23 '16 at 16:54
  • Hi Dan. when i hit 'R' the reply dosent launch and i get this error: error in process filter: Opening input file. any clue? – zeltak Apr 23 '16 at 17:25
  • Try `(add-to-list 'mm-inhibit-file-name-handlers 'openwith-file-handler)` . – Joe Corneli Sep 08 '16 at 10:37

4 Answers4

5

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)
Manuel Uberti
  • 3,150
  • 18
  • 36
2

Yes, vanilla Dired has help for this, and Dired+ provides some more help.

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

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

Drew
  • 75,699
  • 9
  • 109
  • 225
  • thx Drew! i use linux (arch linux). I have been using ! with the dired-x and it works great but what i really want is to press ENTER and launch the app (im lazy i guess). openwith works great in that sense. best, Z – zeltak Apr 23 '16 at 17:34
  • Then bind a key that does that: invokes the app. Usually the question is *which app*? That's what `dired-guess-default` is about. It is used by `dired-guess-shell-command` which is used by via `M-n` (`dired-read-shell-command`) from `!` (`dired-do-shell-command`). It just looks through `dired-guess-shell-alist-user and `dired-guess-shell-alist-default` for a match for your filename, to get the app. If you know the shell command you want for a given file, then do `(dired-do-shell-command THE-SHELL-COMMAND current-prefix-arg THE-FILES-TO-ACT-ON)` in the Emacs command you bind to a key. – Drew Apr 23 '16 at 21:18
1

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.

dat
  • 271
  • 3
  • 10
1

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