Lange habe ich GNOMEDo genutzt nur um Programme zu starten. Auch Kupfer und Launchy habe ich ausprobiert. Was mir an allen Programmen nicht gefällt: Für die Aufgabe, für die ich sie brauche (zum Starten von Programmen) sind sie viel zu groß, zu überladen und sie laufen die ganze Zeit im Hintergrund und brauchen RAM. Durch uzbl habe ich dmenu kennen gelernt. Ein Programm, mit dem man leicht eine Liste von Worten als Menü anzeigen kann. Der Benutzer kann nun das gesuchte Wort eingeben und dmenu schließt automatisch beim Tippen alle unpassenden Wörter aus (dabei wird nicht nur der Wortanfang kontrolliert sondern ob irgendein Teil des Wortes matched). Mit <ENTER> wird das aktuell ausgewählte Wort zurückgegeben und dmenu beendet. Übergibt man diesem Programm die Liste aller im PATH befindlichen Programme und führt das gewählte Programm danach aus hat man schon einen Launcher.
Ich habe nun noch ein kleines Script – dmenuLauncher.pl – geschrieben, das die Programme nach Häufigkeit ihrer Aufrufe sortiert, damit die am häufigsten genutzten Programmen immer zuerst gewählt werden, wenn es eine Mehrdeutigkeit gibt.
Features:
- Kleines Perl-Script, dass nur bei Bedarf gestartet wird und sonst weder Prozessorzeit noch RAM benötigt
- Kann in den meisten Fenstermanagern über Tastenkombination gestartet werden
- Programmen können beim Aufruf Argumente übergeben werden
- Sortiert Programme nach Nutzungshäufigkeit
- Horizontale oder vertikale Anzeige der Programmliste
- Programme im Terminal öffnen
- Optimierung der Programmliste (löschen aller Programme mit geringer Aufrufsanzahl aus der Liste)
- Einfaches hinzufügen von Programmen, die nicht in der Liste sind
Das Script habe ich auf gitHub online gestellt. Das Programm dmenu kann unter Ubuntu über das Paket dwm-tools installiert werden. Also mit dem Befehl sudo apt-get install dwm-tools.
Die Datei dmenuLauncher.pl hat im oberen Teil einen Konfigurationsbereich. Ich habe auf eine externe Konfigurationsdatei verzichtet um diese nicht jedes Mal laden zu müssen.
Zuerst wird der Pfad zur path-Datei (in der die Liste der Programme mit ihrer jeweiligen Aufrufanzahl gespeichert wird) in der Variablen PATHFILE angegeben.
dmenu kann die Programme im Menü nebeneinander oder untereinander angezeigen. Dafür kann man dmenuLauncher.pl entweder mit der Option -h für horizontal (also nebeneinander) oder -v für vertical (also untereinander) aufrufen.
Den Standardmodus, der genutzt wird, wenn nichts angegeben wurde kann man über die Variable MODE steuern. Sie wird entweder auf horizontal oder vertical gesetzt.
Die Konfigurationsvariable NUMBER_OF_LINES gibt die Anzahl von anzuzeigenden Zeilen im vertical-Modus an.
In der Variablen TERMINAL wird der Befehl für den Terminalaufruf gespeichert. Der Platzhalter %COMMAND% wird durch das aufzurufende Kommando (mit Argumenten) ersetzt.
Nun kann durch den Aufruf dmenuLauncher.pl -u die path-Datei generiert werden. Nach dem Installieren oder Löschen von Programmen kann die Datei so auch aktualisiert werden.
Nachdem man dmenuLauncher.pl konfiguriert und die path-Datei (mit der Option -u) generiert hat, kann man eine Tastenkombination dafür einrichten. Bei GNOME unter System -> Einstellungen -> Tastenkombinationen auf den Button “Hinzufügen” klicken, als Namen “dmenuLauncher” und als Befehl den Pfad zur Perldatei (dmenuLauncher.pl) angeben. Nun gibt es in der Liste ganz unten einen neuen Eintrag. Klickt man auf das Feld “Tastenkombination”, so kann man die gewünschte Tastenkombination drücken (ich habe SHIFT+<Space> gewählt, die dann dem Script automatisch zugeordnet wird.
Nach dem Starten des Programms (also drücken der zugeordneten Tastenkombination oder per Terminal) öffnet sich nun das Menü und zeigt die Programmliste an. Nun fängt man an, den gewünschten Befehl einzutippen bis er markiert ist. Man kann auch die Pfeiltasten benutzen. Mit der Eingabetaste wird das gewählte Programm ausgeführt und dmenuLauncher geschlossen.
Drückt man nicht direkt die Eingabetaste sondern <Tab>, so wird der Befehl vervollständigt und man kann noch Argumente angeben.
Ob mit ohne ohne Argumente: Durch ein abschließendes Semikolon wird der Befehl im Terminal ausgeführt.
Ein paar Beispiele:
firef<ENTER>öffnet Firefoxfiref<Tab> http://zinformatik.de<ENTER>öffnet firefox und geht auf die Seite “http://zinformatik.de”top;<ENTER>öffnettopin einem Terminalls -lh ~;<ENTER>zeigt das Ergebnis vonls -lh ~in einem Terminal an.
Da die ganze Liste von Programmen sehr groß ist, man jedoch meist nur einen sehr kleinen Teil nutzt gibt es die Möglichkeit die Liste der Programme zu optimieren. Durch den Aufruf von dmenuLauncher.pl -o werden alle Programme aus der Liste entfernt, die noch nie genutzt wurden. Ein weiteres Argument gibt die Anzahl der Aufrufe an, die ein Programm mindestens haben sollte. So werden durch dmenuLauncher.pl -o 3 alle Programm aus der Liste entfernt die weniger als 3 mal aufgerufen wurden.
Möchte man nach der Optimierung ein Programm aufrufen, das sich nicht mehr in der Liste befindet, so kann man es einfach komplett eingeben. Auch wenn es dann keine Auswahl gibt, wird das Programm ausgeführt und mit der Aufrufsanzahl 1 in die Liste gespeichert.
Um ein neues Programm in die Liste aufzunehmen braucht man es also nur einmal eingeben.
Mit dmenuLauncher habe ich also ein sehr kleines Programm, welches nur kurz läuft um mir die Auswahl eines Programms zu ermöglichen und danach sofort wieder beendet wird. Das Laden ist auch auf älteren Systemen kaum zu spüren, weil keine Bibliotheken geladen werden. Das bedeutet ich kann jedes häufiger genutzte Programm mit 3-4 Tastendrücken ohne irgendeine Verzögerung starten.
Folgende Beiträge könnten Dich auch interessieren:
Schlagworte: Launcher, perl, Scripte










Hi nette idee, allerdings hat es seinen Grund warum die Programme immer laufen: Das bisschen RAM ist der tradeoff für schnelle verfügbarkeit – Ein Programmstart braucht viel länger…
Das argument dass die dinger zu groß sind lass ich gelten – dass sie im Hintergrund laufen und RAM “verbrauchen” ist IMHO zu vernachlässigen.
Hallo.
Super Idee, dein Skript. Ich habe allerdings noch Probleme beim Benutzen:
Mein Vorgehen:
)
1. Ich habe dmenu unter ubuntu 10.10 per “sudo apt-get install suckless-tools ” (wurde mir im Terminal vorgeschlagen, als ich “dmenu -h” eingegeben habe um zu schauen, ob es schon d’rauf ist) installiert
2. Ich hab’ dein Skript nach /home/patrick extrahiert und ausführbar gemacht
3. Ich hab’ dein Skript aufgerufen (ohne “-u”) -> Rückmeldung: “file ‘/home/patrick/bin/path’ not found”
4. Ich habe mir deinen Beitrag hier nochmal durchgelesen (und mir vorgenommen in Zukunft die Schritt für Schritt-Anleitung des Entwicklers abzuarbeiten anstatt das Vorgehen aus dem Gedächtnis nach Lesen des Artikels zu unternehmen
5. Ich hab’ das Skript mit “-u” aufgerufen -> dabei kam die Rückmeldung im Terminal:
“updating …
file ‘/home/patrick/bin/path’ not found: creating …
… creating file ‘/home/patrick/bin/path’ done
updating done …”
6. Ich hab’ das Skript erfolgreich ausgeführt, allerdings noch folgende Probleme:
- firef TAB vervollständigt nicht
- firef ENTER zeigt keine Reaktion
(- firefox ENTER startet Firefox wie gewollt)
- der Ordner “bin” und somit auch die Datei “path” existieren nicht unter /home/patrick
Nachtrag:
zu 3.: die Rückmeldung war: “cat: /home/patrick/bin/path: Datei oder Verzeichnis nicht gefunden”. Diese Rückmeldung bekomme ich jetzt auch direkt beim nochmaligem Ausführen des Skriptes übers Terminal via “./dmenuLauncher.pl” angezeigt. Das Verhalten des Skriptes ist immer noch gleich wie unter 6. aufgeführt.
Hallo
@Simon: Ich persönlich finde 30-40MB Arbeitsspeicher zu viel um hin und wieder mal ein Programm zu starten. Bei meinen 1GB Arbeitsspeicher sind das schonmal 3-4% die grundsätzlich immer weg sind. Mehrere Anwendungen, die immer laufen summieren sich so schnell auf. Bei so großen Programmen wie GNOMEDo und ähnlichen mag ein Programmstart ja länger dauern, aber so ein kleines Perlscript startet wirklich schnell.
@Pa_trick17: Wenn das Verzeichnis bin nicht existiert, kann auch keine Datei erstellt werden. Ich wolte den Standardpfad eigentlich auch auf
/home/user/.dmenuLauncherPathoder etwas ähnliches umstellen, hab es aber dann vergessen. Also erstelle entweder das Verzeichnisbinoder ändere den Pfad in der Variablen PATHFILE so ab, das die Datei in ein Verzeichnis abgelegt wird, das existiert:my $PATHFILE=$ENV{'HOME'}."/.dmenuLauncherPath";Ich habe das Script auf GitHub nun auch angepasst, so dass es die Pathfile direkt im Homeverzeichnis anlegt. Damit sollte das Problem behoben sein.
Großartig
Nach einem kurzen Test hat es bei mir das auch schon sehr kleine aber irgendwie auch nicht so ganz wahre gmrun abgelöst, welches bislang unter der Tastenkombi Alt-X residierte. Wenn man jetzt noch eine Dateinamen Tabcompletetion einbauen könnte (“gedit ~/.zsh” wechselt dann durch alle in Frage kommenden Dateien, also zB zur ~/.zshrc. Noch besser: auch ohne “~/” oder andere Pfadangaben am Anfang wird automatisch vom Homedir des Users ausgegangen, also “gedit .zsh” würde auch zum Erfolge führen) und einen blinkenden Curser zum leichteren korrigieren von Typos bei zB URLs, dann wäre das Script noch einen Tick besser
Anyway: tolle Arbeit!
Großartig! Nach einem kurzen Test hat es bei mir das zwar schon sehr kleine aber leider auch manchmal echt fies träge gmrun verdrängt. Funktioniert wunderbar, nur den (von mir eh nicht benötigten) vertical-mode habe ich nicht starten können – da passiert einfach nichts. Läuft alles, wie es soll, es “lernt” und ist saumäßig schnell

Perfekt wäre das Script, wenn es eine ZSH-mäßige autocompletion auch für Dateinamen gäbe (etwa für ein kleines “geany .irgendeine_config”) bzw wenn auch nach dem ersten ausgewählten Programm noch weitere gewählt werden könnten (“gks gea /etc/ssh/sshd” würde im Ergebnis zu “gksudo geany /etc(ssh/sshd_config” führen. Ob das alles überhaupt ohne größeren Aufwand möglich ist, kann ich nicht einschätzen, aber egal: Wunschdenken und so
Jedenfalls danke für den Launcher!
Hallo ZiB,
der vertical mode ist noch relativ neu in dmenu. Das war ne Zeitlang nur als Patch möglich, keine Ahnung ob Ubuntu den Patch übernommen hat oder das jetzt in dmenu übernommen wurde. Kann sein dass Deine Distribution noch ne alte Version bzw die Version ohne Patch ausliefert.
Also bei mir wird ein Cursor angezeigt. Der blinkt zwar nicht, aber man sieht wo er steht (liegt vielleicht auch an der Version).
Eine Autocompletion für Dateinamen oder ähnliches wird wahrscheinlich nicht so einfach sein. Die dmenu manpage gibt da nichts her. Eigentlich ist das Script ja auch als reiner Launcher gedacht. Also vor allem für Firefox, Pidgin, Gimp, Inkscape,
) meistens keine Argumente mitgibt.
OpenOfficeLibreOffice, … wo man (oder zumindest ichViele Grüße
zimon
Oh, vielen Dank für den Tipp. Ich hab schon lange was vernünftiges gesucht, was man mit Openbox verwenden kann.
Danke für die Rückmeldung. Ich habe mal die aktuelle dmenu-Version kompiliert und damit habe ich dann auch einen Curser – das hilft schonmal. Das mit der Autocompletion dachte ich mir schon, aber ich wollts dennoch loswerden
Grüße,
ZiB
Ich bin begeistert! Kurz aber 2 Sachen, die ich ergänzen würde:
1. Programme, die NUR im terminal aufgerufen werden können, sollten automatisch im terminal aufgerufen werden, also top, htop usw…
2. Es wäre wahnsinnig klasse, wenn man damit auch Verzeichnisse in einem beliebigen Dateimanager anzeigen lassen könnte, also dass man einfach ‘pics’ eingibts, und er öffnet /home/user/media/pics/’ im nautilus. vielleicht kann man das auch über einen einmaligen suchindex reailsieren.
Dann könnte ich mich ohne probleme von gnome-dp trennen. Hat jemand ne idee, wie man die sachen implementieren könnte? perl ist nicht grad mein steckenpferd…
@cpth:
Zu 1: Das wäre in der Tat toll, aber woher soll das Programm bzw. das Skript hier wissen, welches Programm eine grafische Oberfläche besitzt? Das Skript könnte aber außer der Aufrufhäufigkeit noch mitspeichern, ob ein Programm zuletzt mit einem ‘;’ am Ende aufgerufen wurde und das in Zukunft automatisch an den Befehl hängen.
Zu 2: Es würde ja schon helfen, wenn das Skript neben dem Programmnamen auch die Argumente speichern würde, denn dann würde man mit der Eingabe “pics” den Aufruf “nautilus /bla/pics” wiederfinden. Aber leider tut es das nicht.
Also, Zimon (ich hoffe, du heißt nicht wirklich so), mach das mal!
Echt super Ideen.
Noch besser währe, wenn man mit ‘;’ für jedes Kommando umschaltet, ob es im Terminal ausgeführt wird oder nicht. So kann man diese Einstellung auch leichter wieder rückgängig machen.
Wenn die Argumente mitgespeichert werden kann die pathfile ziemlich schnell ziemlich groß werden. Daher werde ich diese Möglichkeit als Option in der Konfiguration an und abschaltbar machen. Zusätzlich wäre ein Parameter praktisch, mit dem man diese Option temporär abschalten kann. Z.B. mit ‘.’ am Ende:
ls ~/command/that/should/not/be/saved.wird nicht gespeichert.
Ich muss mir noch einige Gedanken über verschiedene Implementierungsdetails machen. Ihr hört von mir
Das mit der langen pathfile ist in der tat zu bedenken.
Vielleicht noch eine Anregung: Vorschlag wäre, nicht die argumente mitzuspeichern, sondern in der konfig datei ordner angeben, die mit aufgenommen werden sollen. Dann noch einen standard datei-browser definieren, ähnlich wie man auch das terminal-prog aussuchen kann.
Evtl könnte man noch die tiefe festlegen. Also wenn man /bla/media, 1 hat, dann werden eben auch alle unterordner von media mit einbezogen. Ich persönlich bewege mich zu 90% in einer handvoll ordnern, so dass ein komplettes abbild meiner ordnerstruktur überhaupt nicht nötig wäre. Ein paar ausgewählte orte reichen völlig aus. Ich weiß ja nicht wie einfach oder aufwendig das ist, aber vielleicht kann man ja die bookmarks von nautilus einfach parsen?
Nur ein paar Gedanken
Nur Ordner zu speichern würde die Funktionalität imho zu sehr einschränken. Wenn ich schon Argumente speicher, dann möchte ich mir auch ein
df -hoderfree -mspeichern.Ich habe es jetzt so implementiert, dass man in der Konfiguration einstellen kann, ob Argumente standardmäßig gespeichert werden oder nicht. Diese Option kann man für einen Befehl umkehren indem man einen Punkt anhängt. Also wenn nicht gespeichert wird kann ich mit Punkt trotzdem speichern und wenn gespeichert wird, kann ich dies durch den Punkt verhindern.
So kannst Du Dir auch Deine wichtigsten Ordner speichern und alles andere nicht.
Ich muss noch ein wenig testen, aber ich denke, dass ich spätestens am Wochenende die neue Version hochladen werde.
Viele Grüße
zimon
“Zu 1: Das wäre in der Tat toll, aber woher soll das Programm bzw. das Skript hier wissen, welches Programm eine grafische Oberfläche besitzt?”
Über die Abhängigkeiten, zum Beispiel. Stichwort ‘ldd’…
Super, benutze den Starter seit 15 Minuten und bin begeistern … mal schaun wie es mit dem Langzeitverhalten ist!
Vielen Dank für die super Arbeit!
—
Für alle die eigene Startskripte, z.B. für wine nutzen … einfach den Pfad zu diesen in $PATH eintragen und schon ist man glücklich!
Ich habe mir ein Verzeichnis
~/binerstellt und das in den $PATH eingetragen. Da kommt alles selbstgeschriebene rein.Übrigens nicht vergessen, die $PATH Einstellungen in die
~/.bashrczu schreiben, damit sie beim nächsten Terminalstart auch wieder geladen werden. z.B.Viele Grüße
zimon
Wäre das ein Dateibrowser, du wärest mein Lieblingsheld. Ehrlich.
Hier gibts, wenn man es will, einen dmenu-basierten „Dateibrowser“: https://aur.archlinux.org/packages.php?ID=24386
Funktioniert natürlich nicht nur für Archlinux, einfach den Tarball runterladen und auspacken.
Der Dateibrowser ist echt interessant, vielen Dank
Hier noch ein Link zum entsprechenden Thread im Arch Forum, wo es noch Plugins dazu gibt: https://bbs.archlinux.org/viewtopic.php?id=66662&p=1