xdg-open or "computer, do what I mean"
Command line nerds1 say that graphical user interfaces are less efficient since the former use the keyboard and the latter tend to need the use of the mouse.
Graphical user interface fans say that command line based work-flows need the user to know more things about the system. Although I don't see why this would be an issue (what's the problem with getting to know better the system you use every day?), I can see one clear advantage to the point-and-click work-flow.
When the user wants to open a file, double-clicking on it just works. On the other hand, on the command line, the user needs to call the appropriate application and pass the file name as argument:
evince my_document.pdf
That means that the user has to know which is the application that is going to correctly deal with the given file. For example, this won't work:
evince my_movie.mp4
because evince
is a document viewer and it only understands formats
as pdf
, postscript
, dejavu
or dvi
, but it is not able to
understand MPEG-4
videos.
So how can one replicate the point-and-click behavior on the command line? It would be nice to have something like:
open my_file
and that auto-magically the appropriate application was chosen.
It is of course possible, and it can be done in the same way as the graphical desktop environment does it: using xdg-utils.
Inside a desktop environment (e.g. GNOME, KDE, or Xfce), xdg-open simply passes the arguments to that desktop environment's file-opener application (gvfs-open, kde-open, or exo-open, respectively), which means that the associations are left up to the desktop environment. Therefore, on the command line, one can do:
xdg-open my_file.pdf
and the appropriate application will be used (evince
on GNOME,
okular
on KDE, etc.).
When no desktop environment is detected (for example when one runs a standalone window manager, e.g. stumpwm), xdg-open will use its own configuration files.
Sometimes, the default associations between applications and file
types may not suit the user. For instance, in my case, MPEG-4
videos
were open with mplayer
, but I prefer vlc
. The xdg-mime
tool is
meant to help you change the default associations:
xdg-mime default vlc.desktop video/mp4
The vlc.desktop
parameter is an xdg
desktop file which describes
the vlc
applications. On my Debian GNU/Linux system, this files are
located in /usr/share/applications
. So I was able to look in there
to see what applications xdg-open
could use.
The parameter video/mp4
passed to xdg-mime
is the type of file we
want to associate the application with. In order to know what type of
file we are dealing with, xdg-mime
can query it for you:
xdg-mime query my_movie.mp4
And the answer is:
video/mp4
Now, what happens if there is no desktop file for an application I want to use? For instance, remote sensing image visualization is not possible with the standard image viewers available on GNU/Linux. I personally use the OTB IceViewer, which is a lightweight application using the rendering engine developed for Monteverdi2.
In this case, I have to create a desktop file for the application. I
my case, I have created the otbice.desktop
file in
/home/inglada/.local/share/applications/
with the following contents:
[Desktop Entry] Type=Application Name=OTB Ice Viewer Exec=/home/inglada/OTB/builds/Ice/bin/otbiceviewer %U Icon=otb-logo Terminal=false Categories=Graphics;2DGraphics;RasterGraphics; MimeType=image/bmp;image/gif;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/tiff;image/jpeg;image/png;image/x-xpixmap;image/jp2;image/jpeg2000;
The file has to be executable, so I have to do:
chmod +x /home/inglada/.local/share/applications/otbice.desktop
After that, I can associate the IceViewer with the image formats I want:
xdg-mime default otbice.desktop image/tiff
And it just works.