Das gute dmenu wurde zwar primär für die Verwendung mit dem Fenstermanager dwm entwickelt, es lässt sich aber auch mit anderen kombinieren. Zum ersten Mal habe ich das dieses Jahr bei Crunchbang beobachtet, das auf Debian Squeeze und den Openbox-Fenstermanager setzt.
Doch zuerst einmal, so sieht dmenu für gewöhnlich aus.
Indem man die Anfangsbuchstaben des gesuchten Programms eintippt und das Ganze mit Tab vervollständigt, bewegt man sich in rasender Geschwindigkeit durch alle installierten Anwendungen, die im eigenen $PATH installiert sind. Programme werden danach durch Enter gestartet, fertig. Kein Warten, sehr effizient, Gnome-Do oder gar Unity und die Gnome-Shell werden dadurch zum Ausführen von Programmen überflüssig.
Normalerweise benötige ich bei Openbox und vergleichbaren Fenstermanagern nur das Rechtsklickmenü und ein paar Tastenkürzel. Mit dem Skript dmenu-bind.sh von Gatti Paolo lässt sich aus dmenu aber ganz leicht eine übersichtliche Menüstruktur erstellen.
Der Aufbau ist einfach und leicht nachzuvollziehen. Unter die Menüpunkte wie z.B. web werden der Name des Menüpunkts und der auszuführende Befehl geschrieben.
chromium "chromium"
oder
vim "urxvtcd -e vim"
In dem Menü kann man danach wie gehabt mit den Pfeiltasten und der Enter-Taste navigieren. Das Skript lässt sich z.B. in ~/.config/dmenu/dmenu-bind.sh abspeichern und in ~/.config/openbox/rc.xml oder mit Hilfe von obmenu an eine Taste binden.
<keybind key="A-F3"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>dmenu-bind</name> </startupnotify> <command>~/.config/dmenu/dmenu-bind.sh</command> </action> </keybind>
Das angepasste dmenu kann nun mit Alt+F3 aufgerufen werden.
Das gesamte dmenu-bind.sh Skript sieht so aus.
#!/bin/bash # Custom dmenu-bind.sh # # Copyright 2009, Gatti Paolo (lordkrandel at gmail dot com) # Distributed as public domain. # 09.28.2009 -- First release # 09.29.2009 -- Submenu support added if [ "$1" == "" ]; then title="MainMenu" menu=( # labels commands # Main ========================================= web "$0 web" system "$0 system" tools "$0 tools" settings "$0 settings" ) else case $1 in web) title="web" menu=( # Web ========================================== firefox "firefox" lostirc "lostirc" ) ;; tools) title="tools" menu=( # Tools ======================================== gedit "gedit" geditsudo "gksudo gedit" ) ;; system) title="system" menu=( # System ======================================= home "pcmanfm" tilda "tilda" synaptic "gksudo synaptic" ) ;; settings) title="settings" menu=( # Settings ===================================== volume "$0 volume" dmenu "gedit $0" obconf "obconf" ) ;; volume) title="Volume" menu=( # Volume controls ============================== 0% "amixer sset Master 0" 50% "amixer sset Master 50" 70% "amixer sset Master 70" 100% "amixer sset Master 100" ) ;; esac fi for (( count = 0 ; count < ${#menu[*]}; count++ )); do # build two arrays, one for labels, the other for commands temp=${menu[$count]} if (( $count < ${#menu[*]}-2 )); then temp+="n" fi if (( "$count" % 2 == "0" )); then menu_labels+=$temp else menu_commands+=$temp fi done select=`echo -e $menu_labels | dmenu -p $title -nb black -nf white -sb darkblue -sf white` if [ "$select" != "" ]; then # fetch and clean the index of the selected label index=`echo -e "${menu_labels[*]}" | grep -xnm1 $select | sed 's/:.*//'` # get the command which has the same index part=`echo -e ${menu_commands[*]} | head -$index` exe=`echo -e "$part" | tail -1` # execute $exe & fi