Difference between revisions of "Default applications"

From ArchWiki
Jump to: navigation, search
m (Corrected MimeTypes to MimeType)
(Added version for perl-file-mimeinfo standards compliance)
 
(325 intermediate revisions by 22 users not shown)
Line 1: Line 1:
 
[[Category:Desktop environments]]
 
[[Category:Desktop environments]]
[[zh-cn:Default Applications]]
+
[[ja:デフォルトアプリケーション]]
{{Poor writing|need better introduction (second point is not described)}}
+
[[ru:Default applications]]
There are numerous places to configure default applications on Linux. This page will attempt to address problems related to the following issues:
+
[[zh-cn:Default applications]]
* You need to change a certain default application (e.g. after switching desktop environments), but there appears to be nowhere to configure it, or an application ignores your configuration
+
{{Related articles start}}
* You regularly switch back and forth between several desktop environments, and need to configure some applications (e.g. file manager) on a per-desktop-environment basis, but need to configure others (e.g. web browser) globally
+
{{Related|Desktop entries}}
 +
{{Related|Desktop environment}}
 +
{{Related|Window manager}}
 +
{{Related articles end}}
  
== Changing a default application ==
+
There is frequently more than one application able to handle data of a certain type, so users and even some packages assemble lists of default applications for each [[#MIME types|MIME type]]. While the base install of Arch Linux does not define default applications, [[desktop environments]] you install may do so. Some desktop environments also provide a GUI or a file-manager which can interactively configure default applications. If you do not use a desktop environment, you may need to install additional software in order to conveniently manage default applications.
=== xdg-open ===
+
[[xdg-open]] is a desktop-independent tool for configuring default applications.
+
  
==== Exactly how it works ====
+
== MIME types ==
{{Accuracy|[[xdg-open]] and many other applications now use {{ic|~/.local/share/applications/mimeapps.list}} instead of {{ic|~/.local/share/applications/defaults.list}}}}
+
This is currently very shaky because the standard in question ([http://www.freedesktop.org/wiki/Specifications/mime-actions-spec relevant freedesktop.org document], "Default application ordering" section) is still not finalised and it is even less correctly implemented.
+
  
What happens with the current version of xdg-open (extra/xdg-utils 1.1.0rc1-3) is the following: xdg-open uses xdg-mime (among other things; if you use a mainstream DE like GNOME, KDE or LXDE, xdg-open might try using their specific tools before xdg-mime) to find the MIME type of the file that is to be opened and the default application associated with that MIME type. xdg-mime looks for the default application in the following files:
+
Before setting the default application per file type, the file type must be detected. There are two common ways that this detection is done:
  
/usr/share/applications/defaults.list      (global)
+
* using the file name extension e.g. ''.html'' or ''.jpeg''
~/.local/share/applications/defaults.list  (per user, overrides global)
+
* using a [[w:List of file signatures|magic number]] in the first few bytes of the file
  
The syntax of these files is:
+
However it is possible that a single file type is identified by several different magic numbers and file name extensions, therefore [[w:MIME type|MIME types]] are used to represent distinct file types. MIME types are specified by two parts separated by a slash: {{ic|''type''/''subtype''}}. The type describes the general category of the content, while the subtype identifies the specific data type. For example, {{ic|image/jpeg}} is the MIME type for [[w:JPEG|JPEG]] images, while {{ic|video/H264}} is the MIME type for [[w:H.264/MPEG-4 AVC|H.264]] video.
  
[Default Applications]
+
Technically, every MIME type should be registered with the [[w:Internet Assigned Numbers Authority|IANA]][http://www.iana.org/assignments/media-types/media-types.xhtml], however many applications use unofficial MIME types; these often have a type starting with {{ic|x-}}, for example {{ic|x-scheme-handler/https}} for a HTTPS URL. For local use, the [[#MIME database]] can be used by other packages to register new MIME types.
mimetype=desktopfile1;desktopfile2;...;desktopfileN
+
  
E.g.
+
=== MIME database ===
  
[Default Applications]
+
The system maintains a database of recognized MIME types: the [https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-0.11.html#idm139839923550176 Shared MIME-info Database]. The database is built from the XML files installed by packages in {{ic|/usr/share/mime/packages}} using the tools from the {{Pkg|shared-mime-info}} package.
text/html=firefox.desktop;chromium.desktop
+
  
The intent is to be able to specify applications in order of preference so the next would be selected if the previous is unavailable. However, xdg-open is currently '''broken''' and specifying more than one application for a single MIME type will result in none being used. Be sure to specify only '''one''' application per MIME type.
+
The files in {{ic|/usr/share/mime/}} should not be directly edited, however it is possible to maintain a separate database on a per-user basis in the {{ic|~/.local/share/mime/}} tree.
  
Also see [[xdg-open]] for more information on what affects its behaviour. This information is sufficient for a user to configure default applications on Arch currently.
+
==== New MIME types ====
  
==== How it should work ====
+
{{expansion|Is the process different for assigning an extension to an existing MIME type?}}
However, the behaviour described in the previous section is actually wrong according to the quoted standard draft. defaults.list should only be used by distributions/DEs to specify sane defaults for that particular environment. This file should only be placed in {{Ic|/usr/share/applications/}}, it should be a system-wide setting and it should not be changed by users. Instead, users should use the files {{ic|/usr/share/applications/mimeapps.list}} (global) and {{ic|~/.local/share/applications/mimeapps.list}} (per user, overrides global) to specify custom file associations. The syntax of these files is as follows:
+
 
{{hc|mimeapps.list|
+
This example defines a new MIME type {{ic|application/x-foobar}} and assigns it to any file with a name ending in ''.foo''. Simply create the following file:
 +
 
 +
{{hc|~/.local/share/mime/packages/application-x-foobar.xml|2=
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<nowiki><mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info"></nowiki>
 +
    '''<mime-type type="application/x-foobar">'''
 +
        <comment>foo file</comment>
 +
        <icon name="application-x-foobar"/>
 +
        <glob-deleteall/>
 +
        '''<glob pattern="*.foo"/>'''
 +
    </mime-type>
 +
</mime-info>
 +
}}
 +
 
 +
And then update the MIME database
 +
 
 +
$ update-mime-database ~/.local/share/mime
 +
 
 +
Of course this will not have any affect if no desktop entries are associated with the MIME type. You may need to create new [[desktop entries]] or modify [[#XDG standard|mimeapps.list]].
 +
 
 +
=== Desktop entries ===
 +
 
 +
Each package can use [[desktop entries]] to provide information about the MIME types that can be handled by the packaged software. In order to provide fast search in the reverse direction, the system uses the tools from the {{Pkg|desktop-file-utils}} package to analyze the desktop files and to create an inverse mapping stored in the {{ic|/usr/share/applications/mimeinfo.cache}} file. This is the only file that programs need to read to find all desktop files that might be used to handle given MIME type. Using the database is easier and faster than reading hundreds of ''.desktop'' files directly.
 +
 
 +
The files in {{ic|/usr/share/applications/}} should not be edited directly, it is possible to maintain a separate database on a per-user basis in the {{ic|~/.local/share/applications/}} tree. See [[Desktop entries]] for details.
 +
 
 +
== Set default applications ==
 +
 
 +
The configuration of default applications depends on which launcher is used. Unfortunately there are multiple incompatible standards and many programs even have their own custom formats.
 +
 
 +
The most common standards are explained below for manual editing. You can also use some [[#Utilities|utility]] to do the job, which may be using some of these standards internally or its own configuration format.
 +
 
 +
=== Environment variables ===
 +
 
 +
Console programs in particular are configured by setting an appropriate [[environment variable]], e.g. {{ic|BROWSER}} or {{ic|EDITOR}}. See [[Environment variables#Examples]].
 +
 
 +
=== XDG standard ===
 +
 
 +
The [https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-1.0.html XDG standard] is the most common for configuring desktop environments. Default applications for each MIME type are stored in {{ic|mimeapps.list}} files, which can be stored in several locations. They are searched in the following order, with earlier associations taking precedence over later ones:
 +
 
 +
{| class="wikitable"
 +
! Path !! Usage
 +
|-
 +
| {{ic|~/.config/mimeapps.list}} || user overrides
 +
|-
 +
| {{ic|/etc/xdg/mimeapps.list}} || system-wide overrides
 +
|-
 +
| {{ic|~/.local/share/applications/mimeapps.list}} || ('''deprecated''') user overrides
 +
|-
 +
| {{ic|/usr/local/share/applications/mimeapps.list}}<br>{{ic|/usr/share/applications/mimeapps.list}} || distribution-provided defaults
 +
|}
 +
 
 +
Additionally, it is possible to define [[Desktop environment|desktop-environment]]-specific default applications in a file named {{ic|''desktop''-mimeapps.list}} where {{ic|''desktop''}} is the name of the desktop environment (from the {{ic|XDG_CURRENT_DESKTOP}} environment variable). For example, {{ic|/etc/xdg/xfce-mimeapps.list}} defines system-wide default application overrides for [[XFCE]]. These desktop-specific overrides take precedence over the corresponding non-desktop-specific file. For example, {{ic|/etc/xdg/xfce-mimeapps.list}} takes precedence over {{ic|/etc/xdg/mimeapps.list}} but is still overridden by {{ic|~/.config/mimeapps.list}}.
 +
 
 +
{{Tip|Although deprecated, several applications still read/write to {{ic|~/.local/share/applications/mimeapps.list}}. To simplify maintenance, simply symlink it
 +
$ ln -s ~/.local/share/applications/mimeapps.list ~/.config/mimeapps.list
 +
the reverse symlink unfortunately does not work because of how {{ic|xdg-mime}} writes to this file.
 +
}}
 +
 
 +
{{Note|You might also find files in these locations named {{ic|defaults.list}}. This file is similar to {{ic|mimeapps.list}} except it only lists default applications (not added/removed associations). It is now deprecated and should be manually merged with {{ic|mimeapps.list}}.}}
 +
 
 +
==== Format ====
 +
 
 +
Consider the following example:
 +
 
 +
{{hc|mimeapps.list|2=
 
[Added Associations]
 
[Added Associations]
mimetype&#61;desktopfile1;desktopfile2;...;desktopfileN
+
image/jpeg=bar.desktop;baz.desktop
...
+
video/H264=bar.desktop
 
[Removed Associations]
 
[Removed Associations]
mimetype&#61;desktopfile1;desktopfile2;...;desktopfileN
+
video/H264=baz.desktop
 +
[Default Applications]
 +
image/jpeg=foo.desktop}}
 +
 
 +
Each section assigns one or more desktop entries to MIME types.
 +
* '''Added Associations''' indicates that the applications support opening that MIME type. For example, {{ic|bar.desktop}} and {{ic|baz.desktop}} can open JPEG images. This might affect the application list you see when right-clicking a file in a file browser.
 +
* '''Removed Associations''' indicates that the applications ''do not'' support that MIME type. For example, {{ic|baz.desktop}} cannot open H.264 video.
 +
* '''Default Applications''' indicates that the applications should be the default choice for opening that MIME type. For example, JPEG images should be opened with {{ic|foo.desktop}}. This implicitly adds an association between the application and the MIME type. If there are multiple applications, they are tried in order.
 +
 
 +
Each section is optional and can be omitted if unneeded.
 +
 
 +
=== mailcap ===
 +
 
 +
The {{man|4|mailcap|url=http://linux.die.net/man/4/mailcap}} file format is used by mail programs such as {{Pkg|mutt}} and {{Pkg|sylpheed}} to open non-text files. To have those programs use [[#xdg-utils|xdg-open]], edit {{ic|~/.mailcap}}:
 +
 
 +
{{hc|~/.mailcap|
 +
*/*; xdg-open "%s"
 
}}
 
}}
  
The [Added Associations] section is used to specify preferred (default) applications in decreasing order of preference for the specified MIME type. The [Removed Associations] section is used to explicitly remove any previously inherited associations.
+
{{Warning|If you use {{AUR|run-mailcap}}, it is possible for {{ic|xdg-open}} to delegate to it. This will cause an infinite loop if you configured your {{ic|.mailcap}} as described above.}}
  
Note that the upstream, yet unreleased xdg-utils were fixed to use mimeapps.list instead of defaults.list but the xdg-open bug (specifying multiple applications breaks it completely) still remains.
+
== Utilities ==
  
Currently, the best option is to use {{AUR|mimeo}}, which implements everything explained above correctly. There is also {{AUR|xdg-utils-mimeo}} which provides a patched xdg-open to use mimeo. Both are available in [[Arch User Repository|AUR]].
+
While it is possible to configure default applications and MIME types by directly editing [[#XDG standard|mimeapps.list]] and the [[#MIME database]], there are many tools that can simplify the process. These tools are also important because applications may delegate opening of files to these tools rather than trying to implement the MIME type standard themselves.
  
=== GNOME 3 ===
+
If you use a [[desktop environment]] you should first check if it provides its own utility. That should be preferred over these alternatives.
The xdg-open settings are usually recognized by GNOME, but specific configuration is needed for some tasks. See [[GNOME#Miscellaneous settings]] for more details.
+
  
== Custom File Associations ==
+
=== xdg-utils ===
The following method creates a custom mime type and file association manually.  This is useful if your desktop does not have a mime type/file association editor installed.  In this example, a fictional multimedia application 'foobar' will be associated with all '*.foo' files.  This will be done a per user basis (as opposed to system-wide).
+
  
* First, create the file {{ic|~/.local/share/mime/packages/application-x-foobar.xml}}:
+
{{pkg|xdg-utils}} provides the official utilities for managing MIME types and default applications according to the [[#XDG standard]]. Most importantly, it provides {{ic|/usr/bin/xdg-open}} which many applications use to open a file with its default application. It is desktop-environment-independent in the sense that it attempts to use each environment's native default application tool and provides its own mechanism if no known environment is detected. Examples:
  
  $ mkdir -p ~/.local/share/mime/packages
+
# determine a file's MIME type
  $ cd ~/.local/share/mime/packages
+
  $ xdg-mime query filetype photo.jpeg
  $ touch application-x-foobar.xml
+
image/jpeg
 +
 +
# determine the default application for a MIME type
 +
$ xdg-mime query default image/jpeg
 +
gimp.desktop
 +
 +
# change the default application for a MIME type
 +
  $ xdg-mime default feh.desktop image/jpeg
 +
 +
# open a file with its default application
 +
  $ xdg-open photo.jpeg
 +
 +
# shortcut to open all web MIME types with a single application
 +
$ xdg-settings set default-web-browser firefox.desktop
 +
 +
# shortcut for setting the default application for a URL scheme
 +
$ xdg-settings set default-url-scheme-handler irc xchat.desktop
  
* Then edit {{ic|~/.local/share/mime/packages/application-x-foobar.xml}} and add this text:
+
{{Tip|If no desktop environment is detected, MIME type detection falls back to using {{pkg|file}} which&mdash;ironically&mdash;does not implement the XDG standard. If you want {{pkg|xdg-utils}} to work properly without a desktop environment, you will need to install [[#perl-file-mimeinfo]] or another [[#xdg-open alternatives|xdg-open alternative]].}}
<pre>
+
<?xml version="1.0" encoding="UTF-8"?>
+
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+
<mime-type type="application/x-foobar">
+
<comment>foo file</comment>
+
<icon name="application-x-foobar"/>
+
<glob-deleteall/>
+
<glob pattern="*.foo"/>
+
</mime-type>
+
</mime-info>
+
</pre>
+
Note that you can use any icon, including one for another application.
+
  
* Next, edit or create the file {{ic|~/.local/share/applications/foobar.desktop}} to contain something like:
+
=== xdg-open alternatives ===
  
[Desktop Entry]
+
Because of the complexity of the [[#xdg-utils]] version of {{ic|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 {{ic|/usr/bin/xdg-open}} binary, thus changing the default application behavior of most applications. Others simply provide an alternative method of choosing default applications.
Name=Foobar
+
Exec=/usr/bin/foobar
+
MimeType=application/x-foobar
+
Icon=foobar
+
Terminal=false
+
Type=Application
+
Categories=AudioVideo;Player;Video;
+
Comment=
+
  
Note that Categories should be set appropriately for the application type (in this example, a multimedia app).
+
==== perl-file-mimeinfo ====
  
* Now update the mime database with:
+
{{Pkg|perl-file-mimeinfo}} provides the tools {{ic|mimeopen}} and {{ic|mimetype}}. These have a slightly nicer interface than their {{pkg|xdg-utils}} 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
  
$ update-mime-database ~/.local/share/mime
+
Most importantly, [[#xdg-utils]] apps will actually call {{ic|mimetype}} instead of {{ic|file}} for MIME type detection, if possible. This is important because {{ic|file}} does not follow the [[#XDG standard]].
  
Programs that use mime types, such as file managers, should now open '*.foo' files with foobar.  (You may need to restart your file manager to see the change.)
+
{{Note|{{pkg|perl-file-mimeinfo}} before 0.28-1 does not ''entirely'' follow the [[#XDG standard]]. For example it does not read [https://github.com/mbeijen/File-MimeInfo/issues/20 distribution-wide defaults] and it saves its config in [https://github.com/mbeijen/File-MimeInfo/issues/8 deprecated locations].}}
  
== Maintaining settings for multiple desktop environments ==
+
==== mimeo ====
The {{ic|OnlyShowIn}} field of a .desktop file may be useful; see [http://standards.freedesktop.org/menu-spec/latest/ this page]. I haven't tried setting this field yet; please update this wiki page if you have any info about using {{ic|OnlyShowIn}}.
+
 
 +
{{aur|mimeo}} provides the tool {{ic|mimeo}}, which unifies the functionality of {{ic|xdg-open}} and {{ic|xdg-mime}}.
 +
 
 +
# 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|xdg-utils-mimeo}} patches ''xdg-utils'' so that {{ic|xdg-open}} falls back to mimeo if no desktop environment is detected.
 +
 
 +
==== whippet ====
 +
 
 +
{{aur|whippet}} provides the tool {{ic|whippet}}, which is similar to {{ic|xdg-open}}. It has X11 integration by using {{pkg|libnotify}} to display errors and {{pkg|dmenu}} 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 the standard [[#XDG standard|mimeapps.list]], ''whippet'' can also use a SQlite database of weighted application/MIME type/regex associations to determine which app to use.
 +
 
 +
==== Naive replacements ====
 +
 
 +
The following packages replace {{pkg|xdg-utils}} however they only provide an {{ic|xdg-open}} script. These versions of {{ic|xdg-open}} do not do any delegation to desktop-environment-specific tools and do not read/write the standard [[#XDG standard|mimeapps.list]] config file (each has its own custom config), so they may not integrate well with other programs that manipulate default applications. However you may find them simpler to use if you do not use a desktop environment.
 +
 
 +
{{Warning|If you need any {{ic|xdg-*}} binaries from {{pkg|xdg-utils}} other than {{ic|xdg-open}} you should not use these applications, since they do not provide them.}}
 +
 
 +
{| class="wikitable"
 +
! Package !! Features
 +
|-
 +
| {{AUR|linopen}} || Allows regex rules, can specify fallback file opener
 +
|-
 +
| {{AUR|mimi-git}} || Can change command arguments for each MIME type
 +
|-
 +
| {{AUR|busking-git}} || similar to ''mimi'' but also supports regex rules
 +
|-
 +
| {{AUR|sx-open}} || uses a simple shell-based config file
 +
|-
 +
|}
 +
 
 +
=== lsdesktopf ===
 +
 
 +
{{AUR|lsdesktopf}} provides several methods of searching the MIME database and desktop MIME entries.
 +
 
 +
For example, to see all MIME extensions in the system's ''.desktop'' files that have MIME type {{ic|video}} you can use {{ic|lsdesktopf --gm -gx video}} or to search in the XML database files use {{ic|lsdesktopf --gdx -gx video}}. To get a quick overview of how many and which ''.desktop'' files can be associated with a certain MIME type, use {{ic|lsdesktopf --gen-mimeapps}}. To see all file name extensions in XML database files, use {{ic|lsdesktopf --gdx -gfx}}.
  
 
== Troubleshooting ==
 
== Troubleshooting ==
=== Applications don't appear in the ''Open With...'' context menu (of a file manager) ===
 
Sometimes, a certain application will not appear in the right-click ''Open With...'' dialog. To fix this problem, locate the {{Ic|.desktop}} file in {{Ic|/usr/share/applications}}, edit it as root, and add {{Ic|%U}} to the end of the {{Ic|1=<nowiki>Exec=</nowiki>}} line. For example, Kile currently has this problem; you need to edit {{Ic|/usr/share/applications/kde4/kile.desktop}} and change the line reading {{Ic|1=<nowiki>Exec=kile</nowiki>}} to read {{Ic|1=<nowiki>Exec=kile %U</nowiki>}}. Also, please file a bug against the upstream project if you notice this problem.
 
  
You may also have to edit the {{Ic|MimeType}} list in the {{Ic|.desktop}} file if you install extensions that allow an application to handle additional MIME types.
+
If a file is not being opened by your desired default application, there are several possible causes. You may need to check each case.
 +
 
 +
=== Missing .desktop file ===
 +
 
 +
A [[desktop entry]] is required in order to associate an application with a MIME type. Ensure that such an entry exists and can be used to (manually) open files in the application.
 +
 
 +
=== Missing association ===
 +
 
 +
If the application's desktop entry does not specify the MIME type under its {{ic|MimeType}} key, it will not be considered when an application is needed to open that type. Edit [[#XDG standard|mimeapps.list]] to add an association between the .desktop file and the MIME type.
 +
 
 +
=== Non-default application ===
 +
 
 +
If the desktop entry is associated with the MIME type, it may simply not be set as the default. Edit [[#XDG standard|mimeapps.list]] to set the default association.
 +
 
 +
=== Nonstandard association ===
 +
 
 +
Applications are free to ignore or only partially implement the [[#XDG standard]]. Check for usage of deprecated files such as {{ic|~/.local/share/applications/mimeapps.list}} and {{ic|~/.local/share/applications/defaults.list}}. If you are attempting to open the file from another application (e.g. a web browser or file manager) check if that application has its own method of selecting default applications.
 +
 
 +
=== Variables in .desktop files that affect application launch ===
 +
 
 +
{{Expansion|1=The fact {{ic|MimeType}} entries may be missing in the desktop files is only implied here, i.e. "Even if an application...", though this is a common cause of errors. Some openers may also associate mime types not explicitely listed in a desktop file (such as {{Pkg|exo}}). Further environment-specific factors are at play, e.g. whether {{ic|1=Terminal=true}} has an effect, though latter should arguably be expanded on in [[Desktop entries]].}}
 +
 
 +
Desktop environments and file managers supporting the specifications launch programs according to definition in the ''.desktop'' files. See [[Desktop entries#Application entry]].
 +
 
 +
Usually, configuration of the packaged ''.desktop'' files is not required, but it may not be bug-free. Even if an application containing necessary MIME type description in the ''.desktop'' file {{ic|MimeType}} variable that is used for association, it can fail to start correctly, not start at all or start without opening a file.
 +
 
 +
This may happen, for example, if the {{ic|Exec}} variable is missing internal options needed for how to open a file, or how the application is shown in the menu. The {{ic|Exec}} variable usually begins with {{ic|%}}; for its currently supported options, see [https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables exec-variables].
 +
 
 +
The following table lists the main variable entries of ''.desktop'' files that affect how an application starts, if it has a MIME type associated with it.  
 +
 
 +
{| class="wikitable"
 +
! Variable names !! Example 1 content !! Example 2 content !! Description
 +
|-
 +
| DBusActivatable || DBusActivatable=true || DBusActivatable=false || Application interact with [https://www.freedesktop.org/wiki/Software/dbus/ D-Bus]. <br> See also configuration: [https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#dbus D-Bus].
 +
|-
 +
| MimeType || MimeType=application/vnd.oasis.opendocument.text || MimeType=application/vnd.sun.xml.math || List of MIME types supported by application
 +
|-
 +
| StartupWMClass || StartupWMClass=google-chrome || StartupWMClass=xpad || Associate windows with the owning application
 +
|-
 +
| Terminal || Terminal=true || Terminal=false || Start in default terminal
 +
|}

Latest revision as of 08:04, 10 December 2016

There is frequently more than one application able to handle data of a certain type, so users and even some packages assemble lists of default applications for each MIME type. While the base install of Arch Linux does not define default applications, desktop environments you install may do so. Some desktop environments also provide a GUI or a file-manager which can interactively configure default applications. If you do not use a desktop environment, you may need to install additional software in order to conveniently manage default applications.

MIME types

Before setting the default application per file type, the file type must be detected. There are two common ways that this detection is done:

  • using the file name extension e.g. .html or .jpeg
  • using a magic number in the first few bytes of the file

However it is possible that a single file type is identified by several different magic numbers and file name extensions, therefore MIME types are used to represent distinct file types. MIME types are specified by two parts separated by a slash: type/subtype. The type describes the general category of the content, while the subtype identifies the specific data type. For example, image/jpeg is the MIME type for JPEG images, while video/H264 is the MIME type for H.264 video.

Technically, every MIME type should be registered with the IANA[1], however many applications use unofficial MIME types; these often have a type starting with x-, for example x-scheme-handler/https for a HTTPS URL. For local use, the #MIME database can be used by other packages to register new MIME types.

MIME database

The system maintains a database of recognized MIME types: the Shared MIME-info Database. The database is built from the XML files installed by packages in /usr/share/mime/packages using the tools from the shared-mime-info package.

The files in /usr/share/mime/ should not be directly edited, however it is possible to maintain a separate database on a per-user basis in the ~/.local/share/mime/ tree.

New MIME types

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Is the process different for assigning an extension to an existing MIME type? (Discuss in Talk:Default applications#)

This example defines a new MIME type application/x-foobar and assigns it to any file with a name ending in .foo. Simply create the following file:

~/.local/share/mime/packages/application-x-foobar.xml
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
    <mime-type type="application/x-foobar">
        <comment>foo file</comment>
        <icon name="application-x-foobar"/>
        <glob-deleteall/>
        <glob pattern="*.foo"/>
    </mime-type>
</mime-info>

And then update the MIME database

$ update-mime-database ~/.local/share/mime

Of course this will not have any affect if no desktop entries are associated with the MIME type. You may need to create new desktop entries or modify mimeapps.list.

Desktop entries

Each package can use desktop entries to provide information about the MIME types that can be handled by the packaged software. In order to provide fast search in the reverse direction, the system uses the tools from the desktop-file-utils package to analyze the desktop files and to create an inverse mapping stored in the /usr/share/applications/mimeinfo.cache file. This is the only file that programs need to read to find all desktop files that might be used to handle given MIME type. Using the database is easier and faster than reading hundreds of .desktop files directly.

The files in /usr/share/applications/ should not be edited directly, it is possible to maintain a separate database on a per-user basis in the ~/.local/share/applications/ tree. See Desktop entries for details.

Set default applications

The configuration of default applications depends on which launcher is used. Unfortunately there are multiple incompatible standards and many programs even have their own custom formats.

The most common standards are explained below for manual editing. You can also use some utility to do the job, which may be using some of these standards internally or its own configuration format.

Environment variables

Console programs in particular are configured by setting an appropriate environment variable, e.g. BROWSER or EDITOR. See Environment variables#Examples.

XDG standard

The XDG standard is the most common for configuring desktop environments. Default applications for each MIME type are stored in mimeapps.list files, which can be stored in several locations. They are searched in the following order, with earlier associations taking precedence over later ones:

Path Usage
~/.config/mimeapps.list user overrides
/etc/xdg/mimeapps.list system-wide overrides
~/.local/share/applications/mimeapps.list (deprecated) user overrides
/usr/local/share/applications/mimeapps.list
/usr/share/applications/mimeapps.list
distribution-provided defaults

Additionally, it is possible to define desktop-environment-specific default applications in a file named desktop-mimeapps.list where desktop is the name of the desktop environment (from the XDG_CURRENT_DESKTOP environment variable). For example, /etc/xdg/xfce-mimeapps.list defines system-wide default application overrides for XFCE. These desktop-specific overrides take precedence over the corresponding non-desktop-specific file. For example, /etc/xdg/xfce-mimeapps.list takes precedence over /etc/xdg/mimeapps.list but is still overridden by ~/.config/mimeapps.list.

Tip: Although deprecated, several applications still read/write to ~/.local/share/applications/mimeapps.list. To simplify maintenance, simply symlink it
$ ln -s ~/.local/share/applications/mimeapps.list ~/.config/mimeapps.list 

the reverse symlink unfortunately does not work because of how xdg-mime writes to this file.

Note: You might also find files in these locations named defaults.list. This file is similar to mimeapps.list except it only lists default applications (not added/removed associations). It is now deprecated and should be manually merged with mimeapps.list.

Format

Consider the following example:

mimeapps.list
[Added Associations]
image/jpeg=bar.desktop;baz.desktop
video/H264=bar.desktop
[Removed Associations]
video/H264=baz.desktop
[Default Applications]
image/jpeg=foo.desktop

Each section assigns one or more desktop entries to MIME types.

  • Added Associations indicates that the applications support opening that MIME type. For example, bar.desktop and baz.desktop can open JPEG images. This might affect the application list you see when right-clicking a file in a file browser.
  • Removed Associations indicates that the applications do not support that MIME type. For example, baz.desktop cannot open H.264 video.
  • Default Applications indicates that the applications should be the default choice for opening that MIME type. For example, JPEG images should be opened with foo.desktop. This implicitly adds an association between the application and the MIME type. If there are multiple applications, they are tried in order.

Each section is optional and can be omitted if unneeded.

mailcap

The mailcap(4) file format is used by mail programs such as mutt and sylpheed to open non-text files. To have those programs use xdg-open, edit ~/.mailcap:

~/.mailcap
*/*; xdg-open "%s"
Warning: If you use run-mailcapAUR, it is possible for xdg-open to delegate to it. This will cause an infinite loop if you configured your .mailcap as described above.

Utilities

While it is possible to configure default applications and MIME types by directly editing mimeapps.list and the #MIME database, there are many tools that can simplify the process. These tools are also important because applications may delegate opening of files to these tools rather than trying to implement the MIME type standard themselves.

If you use a desktop environment you should first check if it provides its own utility. That should be preferred over these alternatives.

xdg-utils

xdg-utils provides the official utilities for managing MIME types and default applications according to the #XDG standard. Most importantly, it provides /usr/bin/xdg-open which many applications use to open a file with its default application. It is desktop-environment-independent in the sense that it attempts to use each environment's native default application tool and provides its own mechanism if no known environment is detected. Examples:

# determine a file's MIME type
$ xdg-mime query filetype photo.jpeg
image/jpeg

# determine the default application for a MIME type
$ xdg-mime query default image/jpeg
gimp.desktop

# change the default application for a MIME type
$ xdg-mime default feh.desktop image/jpeg

# open a file with its default application
$ xdg-open photo.jpeg

# shortcut to open all web MIME types with a single application
$ xdg-settings set default-web-browser firefox.desktop

# shortcut for setting the default application for a URL scheme
$ xdg-settings set default-url-scheme-handler irc xchat.desktop
Tip: If no desktop environment is detected, MIME type detection falls back to using file which—ironically—does not implement the XDG standard. If you want xdg-utils to work properly without a desktop environment, you will need to install #perl-file-mimeinfo or another xdg-open alternative.

xdg-open alternatives

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 binary, thus changing the default application behavior of most applications. Others simply provide an alternative method of choosing default applications.

perl-file-mimeinfo

perl-file-mimeinfo provides the tools mimeopen and mimetype. These have a slightly nicer interface than their xdg-utils 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 apps will actually call mimetype instead of file for MIME type detection, if possible. This is important because file does not follow the #XDG standard.

Note: perl-file-mimeinfo before 0.28-1 does not entirely follow the #XDG standard. For example it does not read distribution-wide defaults and it saves its config in deprecated locations.

mimeo

mimeoAUR provides the tool mimeo, which unifies the functionality of xdg-open and xdg-mime.

# 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=

xdg-utils-mimeoAUR patches xdg-utils so that xdg-open falls back to mimeo if no desktop environment is detected.

whippet

whippetAUR provides the tool whippet, which is similar to xdg-open. It has X11 integration by using libnotify to display errors and dmenu 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 the standard mimeapps.list, whippet can also use a SQlite database of weighted application/MIME type/regex associations to determine which app to use.

Naive replacements

The following packages replace xdg-utils however they only provide an xdg-open script. These versions of xdg-open do not do any delegation to desktop-environment-specific tools and do not read/write the standard mimeapps.list config file (each has its own custom config), so they may not integrate well with other programs that manipulate default applications. However you may find them simpler to use if you do not use a desktop environment.

Warning: If you need any xdg-* binaries from xdg-utils other than xdg-open you should not use these applications, since they do not provide them.
Package Features
linopenAUR Allows regex rules, can specify fallback file opener
mimi-gitAUR Can change command arguments for each MIME type
busking-gitAUR similar to mimi but also supports regex rules
sx-openAUR uses a simple shell-based config file

lsdesktopf

lsdesktopfAUR provides several methods of searching the MIME database and desktop MIME entries.

For example, to see all MIME extensions in the system's .desktop files that have MIME type video you can use lsdesktopf --gm -gx video or to search in the XML database files use lsdesktopf --gdx -gx video. To get a quick overview of how many and which .desktop files can be associated with a certain MIME type, use lsdesktopf --gen-mimeapps. To see all file name extensions in XML database files, use lsdesktopf --gdx -gfx.

Troubleshooting

If a file is not being opened by your desired default application, there are several possible causes. You may need to check each case.

Missing .desktop file

A desktop entry is required in order to associate an application with a MIME type. Ensure that such an entry exists and can be used to (manually) open files in the application.

Missing association

If the application's desktop entry does not specify the MIME type under its MimeType key, it will not be considered when an application is needed to open that type. Edit mimeapps.list to add an association between the .desktop file and the MIME type.

Non-default application

If the desktop entry is associated with the MIME type, it may simply not be set as the default. Edit mimeapps.list to set the default association.

Nonstandard association

Applications are free to ignore or only partially implement the #XDG standard. Check for usage of deprecated files such as ~/.local/share/applications/mimeapps.list and ~/.local/share/applications/defaults.list. If you are attempting to open the file from another application (e.g. a web browser or file manager) check if that application has its own method of selecting default applications.

Variables in .desktop files that affect application launch

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: The fact MimeType entries may be missing in the desktop files is only implied here, i.e. "Even if an application...", though this is a common cause of errors. Some openers may also associate mime types not explicitely listed in a desktop file (such as exo). Further environment-specific factors are at play, e.g. whether Terminal=true has an effect, though latter should arguably be expanded on in Desktop entries. (Discuss in Talk:Default applications#)

Desktop environments and file managers supporting the specifications launch programs according to definition in the .desktop files. See Desktop entries#Application entry.

Usually, configuration of the packaged .desktop files is not required, but it may not be bug-free. Even if an application containing necessary MIME type description in the .desktop file MimeType variable that is used for association, it can fail to start correctly, not start at all or start without opening a file.

This may happen, for example, if the Exec variable is missing internal options needed for how to open a file, or how the application is shown in the menu. The Exec variable usually begins with %; for its currently supported options, see exec-variables.

The following table lists the main variable entries of .desktop files that affect how an application starts, if it has a MIME type associated with it.

Variable names Example 1 content Example 2 content Description
DBusActivatable DBusActivatable=true DBusActivatable=false Application interact with D-Bus.
See also configuration: D-Bus.
MimeType MimeType=application/vnd.oasis.opendocument.text MimeType=application/vnd.sun.xml.math List of MIME types supported by application
StartupWMClass StartupWMClass=google-chrome StartupWMClass=xpad Associate windows with the owning application
Terminal Terminal=true Terminal=false Start in default terminal