The crux package for Emacs contains, amongst a list of useful functions (crux does stand for A Collection of Ridiculously Useful eXtensions for Emacs after all), the function
crux-open-with. This interactive function opens the file you currently have open, or the file under your cursor in dired, using the system application for that file.
On Ubuntu 16.04, this function unfortunately does not work. It looks like the application tries to start (icon visible in the dash) and then dies.
After some debugging I discovered that on Ubuntu, the system tool
xdg-open (which is invoked by crux) starts
gvfs-open which on its part does not wait for the app to finish, but returns immediately.
The internal Emacs function
start-process used by
crux-open-with already runs the child process asynchronously. The early return of
gvfs-open results in the sub-process closing, which means your app never gets off the ground.
To fix this, we have to get
xdg-open to work in generic (i.e. non-Gnome / GVFS) mode and thus to wait for the app it spawns to return. We do this by setting the environment variable
Fortunately, we can do this fairly neatly by wrapping the
crux-open-with invocation in a
let where we temporarily change the environment.
In my case it looks like this:
(use-package crux :config (defun cpb-crux-open-with (arg) (interactive "P") (let ((process-environment (cons "XDG_CURRENT_DESKTOP=X-Generic" process-environment))) (crux-open-with arg))) (global-set-key (kbd "C-c o") 'cpb-crux-open-with))
If you don’t also use
use-package (you really should!) just copy out the part after
This has been tested to work on Ubuntu 16.04 in both Unity and Gnome Shell 3.18.