slopen is a simple and user-friendly alternative to xdg-open.
In Linux, the de-facto standard utility to open a file with default
application is xdg-open. Although xdg-open is easy to use,
configuration is complicated: you need to create .desktop files
and debugging its behaviour is a nightmare.
slopen is an alternative with a single simple configuration file.
When it doesn't find a suitable command for a file, the user is
prompted, either directly in the terminal or with dmenu.
If you want to open foo.png, just type
slopen foo.png
and it will choose the right program to open it according to your
~/.slopenrc. When no rules in ~/.slopenrc matches the file,
it will ask the user either in terminal or with dmenu, depending
on whether slopen is run from a terminal or not.
- ksh
- dmenu
Both should be in package repositories in most Linux distribution.
- Drop the slopen into your
$PATH. - Create
~/.slopenrc(for example, seeslopenrc.example)
slopen scans through the 'rules' in ~/.slopenrc one-by-one to decide which command to
use to open a file.
Each rule should look like
<type>: <regex> : <command>
Type can be either M and S.
If type is 'M' then regular expression is matched on the MIME type. If it is 'S'
then it matches file name instead. Whitespaces around the delimiter ':' is ignored.
If multiple rules matches a file, the first rule is always used. Lines started with '#' are ignored.
Example:
S: .*\.ps$ : zathura
S: .*\.pdf$ : zathura
S: .*\.png$ : qiv
M: ^inode/directory$ : rox
M: ^text/.* : emacs
With this config file, say, when you call slopen ~, it will invoke rox ~.
While it is possible to just replace the xdg-open executable with slopen, this is usually not enough to change the behaviour of some applications such as Firefox, which uses the C API directly to access the default application database instead of accessing it through the xdg-open binary.
Since too many applications is using the same xdg-mime database through different interfaces, perhaps the easiest way to make everything use slopen is to directly setting the default application of every MIME types to slopen in the xdg-mime database. Doing this will also makes xdg-open forward everything to slopen.
To do this, create the file ~/.local/share/applications/slopen.desktop with the following content:
[Desktop Entry]
Name=Slopen
Exec=slopen %F
Type=Application
Then use the following command to set the default application of all known MIME types to slopen.desktop:
find /usr/share/applications ~/.local/share/applications \
-type f -name '*.desktop' \
-exec awk 'match($0, /^MimeType=(.*)/, m) {\
split(m[1],t,";");\
for (i in t) \
if (t[i]!="") \
print(t[i])
}' {} \; | \
xargs -I {} xdg-mime default slopen.desktop {}
You may want to run this again after installing an application which introduces a new MIME type. So you may want to add it as your cron jobs, into /etc/rc.local or to some hooks in your distro's package manager, depending on your preference.