Programs implement default application associations in different ways. While command-line programs traditionally use environment variables, graphical applications tend to use XDG MIME Applications through either the GIO API, the Qt API, or by executing
/usr/bin/xdg-open, which is part of xdg-utils. Because xdg-open and XDG MIME Applications are quite complex, various alternative resource openers were developed. The following table lists example applications for each method.
|Method||Uses XDG||Application examples|
|GIO's GAppInfo||Yes||Firefox, GNOME Files, PCManFM, Thunar, Thunderbird|
|custom||Usually not||mc, ranger|
|environment variables||No||man, sudoedit, systemctl|
|D-Bus's FileManager1||org.freedesktop.FileManager1||Firefox (Open containing folder)|
Programs sometimes need to open a file or a URI in the user's preferred application. To open a file in the user's preferred application the filetype needs to be detected (usually using filename extensions or magic numbers mapped to MIME types) and there needs to be an application associated with the filetype.
- XDG MIME Apps: implements the XDG MIME Applications specification
- RegEx rules: allows MIME types to be associated with applications using regular expressions
- URI support: allows arbitrary URI schemes to be associated with applications
|Name||Package||XDG MIME Apps||RegEx rules||URI support|
Because of the complexity of the xdg-utils version of xdg-open, it can be difficult to debug when the wrong default application is being opened. Because of this, there are many alternatives that attempt to improve upon it. Several of these alternatives replace the
/usr/bin/xdg-open executable, thus changing the default application behavior of most applications. Others simply provide an alternative method of choosing default applications.
provides the tools and . These have a slightly nicer interface than their equivalents:
# determine a file's MIME type $ mimetype photo.jpeg photo.jpeg: image/jpeg # choose the default application for this file $ mimeopen -d photo.jpeg Please choose an application 1) Feh (feh) 2) GNU Image Manipulation Program (gimp) 3) Pinta (pinta) use application # # open a file with its default application $ mimeopen -n photo.jpeg
Most importantly, xdg-utils programs will actually call
file instead of
mimetype for MIME type detection if it does not detect your desktop environment. This is important because
file does not follow the XDG standard.
AUR provides the tool
mimeo, which unifies the functionality of
# determine a file's MIME type $ mimeo -m photo.jpeg photo.jpeg image/jpeg # choose the default application for this MIME type $ mimeo --add image/jpeg feh.desktop # open a file with its default application $ mimeo photo.jpeg
However a big difference with xdg-utils is that mimeo also supports custom "association files" that allow for more complex associations. For example, passing specific command line arguments based on a regular expression match:
# open youtube links in VLC without opening a new instance vlc --one-instance --playlist-enqueue %U ^https?://(www.)?youtube.com/watch\?.*v=
AUR patches xdg-utils so that
xdg-open falls back to mimeo if no desktop environment is detected.
AUR provides the tool
whippet, which is similar to
xdg-open. It has X11 integration by using to display errors and to display choices between applications to open.
# open a file with its default application $ whippet -M photo.jpeg # choose from all possible applications for opening a file (without setting a default) $ whippet -m photo.jpeg
In addition to implementing XDG MIME Applications, whippet can also use a SQlite database of weighted application/MIME type/regex associations to determine which app to use.
The following packages conflict with and provide
If you want to use one of these resource openers while still being able to use
- AUR - 170-line Bash script, supports regex rules
- AUR - 130-line Bash script, can change command arguments for each MIME type
- AUR - 80-line Perl script similar to mimi but also supports regex rules
- AUR - 60-line Bash script, uses a simple shell-based config file
xdg-opento delegate to it. This will cause an infinite loop if you are using the
/etc/mailcapfrom , because it also delegates to