Open Source im professionellen Einsatz
Linux-Magazin 06/2008
© Pixelio.de, Jürgen Heimerl

© Pixelio.de, Jürgen Heimerl

At Your Fingertips: Perl startet Programme nach Namen

Schnellstart

Das Mac-Utility Spotlight führt selbst hartgesottene Apple-Fanboys von der Maus wieder zurück zur Tastatur. Ein kurzes Perl-Skript implementiert das praktische Utility für den Linux-Desktop nach.

916

Wer schon einmal auf einem zugekleisterten Desktop nach dem Icon einer bestimmten Applikation gesucht hat, fragt sich vielleicht: Wer ist nur auf die Idee gekommen, Applikationen mit der Maus auszuwählen? Denn wer weiß, wie die Applikation heißt, hat doch keinen Grund, zehn Sekunden damit zu verplempern, das entsprechende Icon aus Dutzenden auf dem Desktop herauszusuchen oder sich durch verschachtelte Dropdown-Menüs zu hangeln, um das mühsam gefundene dann endlich per Mausklick zu starten.

Lernfähiger Starter

Beim in Perl geschriebenen Spotty sorgt stattdessen ein selbst definierter Hotkey dafür, dass sofort rechts oben im Desktop ein Fenster aufpoppt (Abbildung 1). Dessen Textfeld hat nun bereits den Tastaturfokus. Schon nach den ersten dort eingetippten Buchstaben »fi« weiß Spotty, dass es Firefox aufrufen soll, und pumpt den Namen in der Auswahlliste ganz nach oben. Der Benutzer drückt die [Tab]-Taste, um den Vorschlag zu übernehmen und die Applikation auch gleich zu starten. Verstrichene Zeit: nicht mal zwei Sekunden. Das Ganze funktioniert ganz ähnlich wie [Alt]+[F2] unter KDE oder Gnome, nur dass man in den eigenen Quellcode noch nach Belieben Sonderfunktionen einbauen kann wie etwa den Start von Sudo-Programmen.

Abbildung 1: Der Benutzer hat Spotty mit dem Hotkey [Strg]+[U] aufgerufen und »gi« ins Eingabefeld getippt. Spotty erkennt, dass es sich bei der gewünschten Applikation nur um den Gimp handeln kann. Die [Tab]-Taste komplettiert zu »gimp« und startet das Programm.

Spotty lernt aus erfolgreichen Starts und merkt sich die gefundenen Programmnamen in einer persistenten Datenbank. Beim ersten Aufruf tippt der Benutzer noch »firefox« ein und schickt den String mit der [Enter]-Taste ab. Daraufhin sucht Spotty in sämtlichen Verzeichnissen der Umgebungsvariablen »$PATH« nach dem Programm und führt es aus.

Schon beim nächsten Aufruf versucht das Tool, die Eingabe des Benutzers mit den bereits gelernten Programmnamen zur Deckung zu bringen, und zeigt Treffer rechts vom Eingabefeld an. Sieht der Benutzer, dass Spotty das gewünschte Programm ans Kopfende der Trefferliste verschoben hat, muss er nur die [Tab]-Taste drücken, damit Spotty die gewünschte Applikation sofort startet.

Spotty führt diese Applikation mit »exec« aus. Sie überlädt den aktuellen Prozess (also das Perl-Skript) mit der externen Applikation, woraus folgt, dass Spotty aus der Prozesstabelle verschwindet und dort nur die gestartete Applikation übrig bleibt. Die »exec«-Zeile 110 (Listing 1) in der Funktion »launch« ist also das Ende des Skripts, da der Prozess aus ihr nicht mehr zurückkehrt.

Die Datenbank für die gemerkten Programmnamen ist ein persistenter Hash, der mit dem CPAN-Modul DB_File mit einer Berkely-DB-Datei verknüpft ist. Das Skript frischt die Datenbank auf, sobald es den mit »tie« verbundenen Hash verändert. Damit beim Programmschluss auch alles ordentlich herunterfährt, setzt Zeile 106 kurz vor dem Exec-Kommando noch ein »untie«-Kommando ab, um den Hash von der Datenbankdatei loszueisen und alle Änderungen zu speichern.

Malen mit Tk

Wie Listing 1 zeigt, nutzt Spotty das Tk-Modul vom CPAN, um das Applikationsfenster mit dem Eingabefeld zu zeichnen. Damit dies nicht irgendwo auf dem Desktop landet, sondern genau in der rechten oberen Ecke, ruft es danach die Methode »geometry()« mit dem Parameter »-0+0« auf. »-0« steht hierbei für die am weitesten rechts liegende x-Koordinate, »+0« für die oberste y-Koordinate.

Das Hauptfenster mit dem Namen »$top« ist vom Typ »MainWindow« und enthält zwei so genannte Widgets: Links ein Eingabefeld vom Typ »Entry« und rechts davon eine Anzeige vom Typ »Label«. Am Eingabefeld-Widget »$entry« hängt eine Textvariable »$input«, in der Tk den vom Benutzer eingetippten Text ablegt und nach jedem Tastendruck auffrischt. Da die Option »-validate« den Wert »key« aufweist, springt Tk bei jedem Tastendruck im Eingabefeld auch noch die Funktion »validate()« (definiert ab Zeile 63) an, deren Referenz das Widget in der Option »-validatecommand« bekam.

Diese Funktion validiert hier aber nichts, denn sie gibt immer »1« zurück, ist also mit allem einverstanden. Sie dient nur dazu, nach jedem Tastendruck des Benutzers einen Callback aufzurufen, der in der Datenbank nach Treffern schaut. Das Label-Widget rechts vom Entry-Widget hingegen überwacht eine Textvariable »$label_text«, sobald sich deren Wert ändert, frischt der Tk-Manager die Anzeige auf. Findet die Funktion »validate()« also mit »matches()« (Zeile 71) Treffer zum gerade eingegebenen Wort, fügt sie diese durch Zeilenumbrüche getrennt zu einem String zusammen und pflanzt ihn in »$label_text« ein. Daraufhin zeigt Spotty den Treffer rechts vom Eingabefenster an, ohne dass hierzu weitere Programmierschritte notwendig wären.

Der Packer (Zeilen 44, 45) packt beide Widgets mit der Option »-side => "left"« in das Containerobjekt, das Hauptfenster »$top«. Wandern mehrere Objekte mit »left« in den Container, reiht der Packer sie von links nach rechts auf. Die Vorgabe »left« bedeutet für den Packer nämlich, dass er neue Widgets an den linken Rand des noch verfügbaren Platzes klebt. Ist links schon ein Widget, wandert das nächste also an den linken Rand des rechts verbliebenen freien Raums.

Spotty reagiert auf die [Enter]- und die [Tab]-Taste. [Enter] übernimmt den bisher eingegebenen String und [Tab] schnappt sich das erste Element aus der Vorschlagsliste. Perl-Tk bindet die Tasten durch »bind«-Aufrufe in den Zeilen 48 und 50 an die Funktionen »launch()« (definiert ab Zeile 94) und »complete()« (ab Zeile 86). Letztere setzt lediglich die Variable des Entry-Widgets auf den obersten Treffer, den »$first_match« speichert, und ruft anschließend »launch()« auf, damit der Benutzer nicht mal mehr [Enter] betätigen muss, um die gefundene Applikation zu starten. Der Bind-Eintrag in Zeile 47 legt fest, dass Spotty abbricht, falls jemand [Strg]+[Q] drückt und somit aussteigen möchte, ohne eine Applikation zu suchen.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Episodenfilm

    Ein Perl-Skript mit GTK-2-Oberfläche merkt sich, wie weit sein Anwender gespeicherte Videos angesehen hat, und fährt auf Wunsch an der Stelle der letzten Unterbrechung wieder fort.

  • Lesezeichen-Zentrale

    Ob im Büro, zu Hause oder mit dem Laptop im Hotelzimmer: Wer oft durch das World Wide Web surft, will seine Bookmarks immer abrufbar haben. Sie auf allen Rechnern synchron halten ist sehr umständlich. Ein CGI-Skript hilft und macht die persönliche Bookmark-Liste überall verfügbar.

  • Perl-Snapshot

    Push-Notifications auf sein Handy halten den abwesenden Hausherrn darüber auf dem Laufenden, welche Clients sich im WLAN zu Hause an- und abmelden.

  • Der optimale Arbeitsplatz

    Ein schönes Hintergrundbild befriedigt zwar ästhetische Bedürfnisse. Doch wer den KDE-Desktop nutzen möchte, um Systemdaten im Blick zu behalten, der bereichert ihn mit selbst geschriebenen oder den zahlreich im Netz verfügbaren Superkaramba-Themes.

  • Kursmakler

    Das Perl Object Environment versetzt ein Skript in die Lage, intern kooperatives Multitasking ohne Zutun des Betriebssystem-Schedulers zu betreiben. Das Beispiel für eine POE-Anwendung ist ein simpler, aber ruckfrei operierender Aktienticker. Der grafischen Oberfläche verleiht GTK ein Gesicht.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.