From an ancient post I previously did…I need to refresh my mind on this topic often enough thought it worthy of breaking it out.
How Linux systems figure out what program should open a file⌗
Programs that handle arbitrary files (e.g. web browsers, irc clients, file managers) delegate to a general purpose resource handler. XDG MIME Applications is the ubiquitous option here, and is not only an implementation, but a full blown specification.
Querying the defaults you have⌗
To check a default program to be used based on MIME type:
xdg-mime query default text/plain
Or, if unsure of the MIME type, to check a default program based on a sample input file:
xdg-mime query filetype 2016-01-12-jdbc-overflow.markdown
Setting new defaults⌗
To set a default handler, the program needs a, the program needs a
.desktop launcher. First make sure one exists:
$ locate -i nvim.desktop /usr/share/applications/nvim.desktop
Then bind it as the default for a given file (MIME) type:
xdg-mime default nvim.desktop text/plain
Test it out:
Managing explicit mappings with mimeapps.list⌗
Custom handler MIME mappings are stored in
~/.local/mimeapps.list (Arch) or
Its worth mentioning
/usr/share/applications/mimeinfo.cache, which is a raw reverse cache for the
.desktop information. If
xdg-mime fails lookup an explicit MIME type entry in a
mimeapps.list, it will fallback to this cache. There is no way to define priorities in it, so get in the habbit of maintaining a neat little
mimeapps.list as part of your dotfiles repo.
I discovered a neat pattern looking at the HexDSl’s awesome dots repo. He creates agnostic desktop file based on type, such as
pdf.desktop. As time moves on and you may want to change your default PDF viewer, there is one clean place to do it in. Similarly create
torrent.desktop and so on.
See my dots repo .local/share/applications for a working example.