On a recent Reddit comment, tdstoff7 asked if I had considered writing an "Open with" DWIM shell command for those times one would like to open a file externally using an app other than the default. I hadn't, but nice idea.
Take images as an example. Though Emacs can display them quickly, I also open images externally using the default app (Preview in my case). But then there are those times when I'd like to open with a different app for editing (maybe something like GIMP). It'd be nice to quickly choose which app to open with.
There isn't much to the code. Get a list of apps, ask user to pick one (via completing-read), and launch the external app via dwim-shell-command-on-marked-files
.
There's likely a better way of getting a list of available apps (happy to take suggestions), but searching in "/Applications" "~/Applications" and "/System/Applications" does the job for now.
(defun dwim-shell-commands-macos-open-with ()
"Convert all marked images to jpg(s)."
(interactive)
(let* ((apps (seq-sort
#'string-lessp
(seq-mapcat (lambda (paths)
(directory-files-recursively
paths "\\.app$" t (lambda (path)
(not (string-suffix-p ".app" path)))))
'("/Applications" "~/Applications" "/System/Applications"))))
(selection (progn
(cl-assert apps nil "No apps found")
(completing-read "Open with: "
(mapcar (lambda (path)
(propertize (file-name-base path) 'path path))
apps)))))
(dwim-shell-command-on-marked-files
"Open with"
(format "open -a '%s' '<<*>>'" (get-text-property 0 'path selection))
:silent-success t
:no-progress t
:utils "open")))
dwim-shell-commands-macos-open-with
is now included in dwim-shell-command, available on melpa. What other uses can you find for it?