One thing I always liked about Windows (compared to Linux) is that it's very easy to add custom actions to the context (right-click) menu for any given file types. For example, I used this ability with Universal Extractor to add
UniExtract... entries to the context menu of archive files, and I use it with Open with Arguments to add
Open with arguments... to .exe and .bat files. I missed that ability for quite some time once I began using Linux as my primary OS. Something as simple as extracting Zip files, for example, would require jumping to the command line and entering an appropriate
unzip command. However, a while back I stumbled across a tutorial entitled, "Creating Konqueror Service Menus", and was very pleasantly surprised to discover that this allowed me to do exactly what I had wanted for so long.
I setup a few custom actions (called "servicemenus" in KDE) a while back on my home system and pretty much forgot about it since it "just worked", but since I'm now using a new desktop system at home I'm already missing these custom actions. So, I figured I'd document them here while setting them up again. Hopefully this information will help out other Linux users. Much more thorough instructions can be found in the article referenced above - my instructions should be treated as more of a reference.
To begin, you'll need to create a new .desktop file for the action you want to perform. For the purposes of this article, I'm going to add a context menu item that will extract RAR files to the current directory. So, we'll create a new file named
~/.kde/share/apps/konqueror/servicemenus/rar.desktop. The file name is arbitrary, but it must be saved in the specified location, and must end with the
.desktop extension. Next open the file in your favorite editor and add the following:
[Desktop Action unrar]
Exec=launch.sh %d unrar x \"%f\"
This code is not very intuitive, so I'll explain each option
- ServiceTypes - specifies the type of files with which the action should be associated. The easiest way to determine this information is to run Konqueror, click Settings, Configure Konqueror, and select the File Associations section. Enter the file extension you want to associate the action with (in this case,
rar, and then add the listed file types to the Service Types entry. Repeat for each extension if you want to associate with multiple types
- Actions - specifies the name of the stanza that defines the action. Multiple actions can be specified, but we'll only use one here. Just make sure that the name entered here matches the
[Desktop Action xxx] defined below.
- Name - the name of the context menu entry that will appear when right-clicking on the given type of files
- Exec - the action to perform when selected; more details below. Please also see this page for a full discussion of this item, including a list of valid field codes.
- Icon - the name of the icon to associate with the context menu entry (optional). This can point to a real file if you want to use a custom icon, but you have to specify the full path and filename. In this case, I'm telling it to use the
package icon from the current icon set. The easiest way (that I know of) to view these "pre-defined" icons is to right-click on any K-menu entry, select
Edit Item, and click on the icon button for that item, It'll bring up an icon browser. Find the icon you like best, note the name, then close the windows and add it to the
Now, let's discuss the
Exec entry. Ordinarily you'd probably want to call the binary directly; eg.,
unrar x \"%f\". In this case, however, I want to get feedback on the current progress of the operation, as well as any errors that might have occured. Since
unrar is a CLI application, running it from a GUI wouldn't provide any feedback. It would simply run in the background and then exit. To work around this, I created a "wrapper" script called
launch.sh that will accept arguments passed by KDE and run the command in a standalone
xterm terminal. Using this method, clicking the the action in the context menu will spawn a new
xterm window, which will then display the current status of the operation. It will also allow you to enter any additional information that may be necessary, such as answering an overwrite prompt or providing an archive password.
The code for the wrapper script is listed below. The only dependency is that
xterm must be installed in an your
# enable support for spaces
# check for number of arguments
if [ "$2" = "" ]; then
echo "Usage: $0 <dir> <command>"
# set directory and command
# execute command in xterm
xterm -e $COM
That should do it. Save both of those files, make sure that
launch.sh is copied to a location in your
$PATH, then try right-clicking on a RAR file. Under the
Actions submenu, you should now see an entry called
Extract Here. Click it, and if all goes well the contents of the RAR file should be extracted to that directory.
For reference, here's a list of all KDE servicemenus that I have created:
- audacious.desktop - Enqueue and begin playing all selected audio files in Audacious (originally written for XMMS, and still contains the commented code if desired)
- iso.desktop - Mount an ISO CD-Rom image in a subdirectory of the current folder to allow file browsing and copying; press
Enter when complete to unmount the ISO and remove the temporary directory. This service menu requires my mountiso.sh script.
- par.desktop - Repair damaged RAR archives using associated PAR files
- rar.desktop - Extract contents of RAR archives
- tbz.desktop - Extract contents of bzipped tarballs
- tgz.desktop - Extract contents of gzipped tarballs
- vmdk.desktop - Mount a VMware disk image in a subdirectory of the current folder to allow file browsing and copying; press
Ctrl-C when complete to unmount the disk image and remove the temporary directory. This service menu requires my mountvmdk.sh script. More details can be found in the How to Mount VMware Disk Images under Linux article.
- xine.desktop - Enque and begin playing all selected video files in Xine
- zip.desktop - Extract contents of ZIP archives
- launch.sh - Wrapper script to display service menu output in an
xterm window; most of my servicemenus require this script
 Yes, I know that I can install a GUI archiving utility such as Ark. However, that's not really relevant here for two reasons:
- I want to right-click and extract directly within Konqueror without first opening it in a separate utility
- File extraction is just an easy-to-visualize simple example - there are other cases where install a separate utility is not an option or just doesn't make any sense
 Yes, you could theoretically call
xterm directly from the .desktop file rather than using a wrapper script, but I couldn't get it to work properly. I had issues with getting
xterm and the associated command (in this case,
unrar) to accept the correct path, as well as dealing with spaces in the filename. My wrapper script will handle anything that's thrown at it (so far, anyway...).