Ein individuelles dmenu erstellen

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

Schreibe einen Kommentar

Du kannst diese HTML tags benutzen

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>