Clipboard steuern via Zenity und Xclip

Aus LinuxUser 10/2014

Clipboard steuern via Zenity und Xclip

© Giuseppe Anello, 123RF

Maßanfertigung

Nicht jeder Fenstermanager bringt ein eigenes Programm für das Verwalten der Zwischenablage mit. Mit Zenity und einem Skript steuern Sie komfortabel das überall verwendbare Xclip.

Typische Programme für das Verwalten der Zwischenablage, wie Klipper für KDE oder Clipit, das sich unter anderem in Gnome integriert, bringen umfangreiche Features für die Verwaltung der Zwischenablage mit. Allerdings lassen sie sich nicht unbedingt so leicht in jeden Fenstermanager integrieren. Wer keinen der Desktop-Platzhirsche nutzt, steht also unter Umständen ohne eine Clipboard-Verwaltung da. Zudem arbeiten diese Programme in der Regel so, dass sie eine Historie der Zwischenablage anlegen, in der ältere Einträge immer weiter nach hinten rutschen und schließlich aus der Liste verschwinden.

Die passenden Tools

Um unter Linux möglichst schnell eine Anwendung zu erstellen, bedarf es oft nur der passenden Tools, etwas Kreativität und ein wenig Fantasie. Das gilt auch für das Implementieren einer selbstgestrickten Verwaltung für die Zwischenablage: Im Folgenden zeigen wir, wie Sie mit Zenity [1] schlanke Dialoge für das Skripten der Zwischenablage mittels Xclip [2] einrichten und die so erstellte GUI-Anwendung schließlich auf effiziente Weise für alltägliche Aufgaben in den Desktop integrieren.

Sowohl Zenity als auch Xclip lassen sich in den gängigen Distributionen schnell über den jeweiligen Paketmanager installiert. Über die Kommandozeile installieren Sie beide via Apt oder Yum auch in einem Rutsch, indem Sie entweder sudo apt-get install zenity xclip auf einem DEB-basierten System oder yum install zenity xclip auf einem RPM-basierten Rechner eingeben.

Die hier vorgestellte Zwischenablage umfasst zehn Speicherplätze, deren Inhalt Sie belegen, abrufen, löschen oder auch nachträglich mit einem Editor manuell bearbeiten können.

Ein paar Zeilen Skript

Listing 1 legt zunächst einen Editor fest, mit dem Sie die einzelnen Stellplätze der Zwischenablage nachträglich manuell bearbeiten, und definiert ein Verzeichnis für die Inhalte der Zwischenablage. Das Kommando test in Zeile 4 überprüft, ob dieses Verzeichnis bereits besteht, und legt es neu an, falls es bislang noch nicht existiert.

Listing 1

#!/bin/bash
EDITOR=gedit
SPEICHERPFAD=~/.zwischenablage
test ! -d $SPEICHERPFAD && mkdir $SPEICHERPFAD
for x in $(seq 1 10); do
  test ! -f ${SPEICHERPFAD}/speicher${x} && > ${SPEICHERPFAD}/speicher${x}
done
aktion=$1
laenge=80
sp=$(zenity --list --title="Speicherplatz auswählen" \
     --text "Speicher ${1}!\nAktuell in der Zwischenablage: \
            $(xclip -o | cut -c 1-${laenge})" \
     --column "Speicherplatz" \
     "Speicher 1: $(cat ${SPEICHERPFAD}/speicher1 | cut -c 1-${laenge})" \
     "Speicher 2: $(cat ${SPEICHERPFAD}/speicher2 | cut -c 1-${laenge})" \
     "Speicher 3: $(cat ${SPEICHERPFAD}/speicher3 | cut -c 1-${laenge})" \
     "Speicher 4: $(cat ${SPEICHERPFAD}/speicher4 | cut -c 1-${laenge})" \
     "Speicher 5: $(cat ${SPEICHERPFAD}/speicher5 | cut -c 1-${laenge})" \
     "Speicher 6: $(cat ${SPEICHERPFAD}/speicher6 | cut -c 1-${laenge})" \
     "Speicher 7: $(cat ${SPEICHERPFAD}/speicher7 | cut -c 1-${laenge})" \
     "Speicher 8: $(cat ${SPEICHERPFAD}/speicher8 | cut -c 1-${laenge})" \
     "Speicher 9: $(cat ${SPEICHERPFAD}/speicher9 | cut -c 1-${laenge})" \
     "Speicher 10: $(cat ${SPEICHERPFAD}/speicher10 | cut -c 1-${laenge})" \
     | sed "1 s/Speicher /speicher/1" | grep -Eo "speicher[0-9]{1,2}")
if [ $aktion = "belegen" ] && [ $(echo -n $sp | wc -m) -gt 0 ] 2>/dev/null; then
  xclip -o > ${SPEICHERPFAD}/${sp}
elif [ $aktion = "abrufen" ] && [ $(echo -n $sp | wc -m) -gt 0 ] 2>/dev/null; then
  cat ${SPEICHERPFAD}/${sp} | xclip -i -selection primary
  cat ${SPEICHERPFAD}/${sp} | xclip -i -selection secondary
  cat ${SPEICHERPFAD}/${sp} | xclip -i -selection clipboard
elif [ $aktion = "löschen" ] && [ $(echo -n $sp | wc -m) -gt 0 ] 2>/dev/null; then
  > ${SPEICHERPFAD}/${sp}
elif [ $aktion = "bearbeiten" ] && [ $(echo -n $sp | wc -m) -gt 0 ] 2>/dev/null; then
  $EDITOR ${SPEICHERPFAD}/${sp}
fi

Der Codeblock in den Zeilen 6 bis 8 legt die einzelnen Speicherplätze für die Zwischenablage an. Dazu arbeitet eine For-Schleife eine Liste ab, die das Kommando seq 1 10 erstellt hat. Innerhalb des Ausführungsblocks zwischen do und done erscheint die jeweilige Ziffer anstelle von ${x}. Zeile 7 testet also zunächst, ob die Dateien speicher1 bis speicher10 im Zielverzeichnis bestehen. Ist dies nicht der Fall, legt der hintere Abschnitt von Zeile 7 diese Dateien durch den Umleitungsoperator > an.

In Zeile 10 fängt das Skript den ersten übergebenen Parameter ab und speichert ihn in der Variablen aktion. Zeile 11 definiert die maximale Länge für die Zeichenkette, die der Zenity-Dialog anzeigen soll. Das verhindert, dass beim Abspeichern einer längeren Textpassage in einem der Speicherplätze der entsprechende Dialog unnötig in die Breite wächst. Die ersten 80 Zeichen dürften völlig genügen, um zu erkennen, welcher Text in den Speicherplatz wandert.

Im Dialog

Die Zeilen 13 bis 27 erzeugen den eigentlichen Zenity-Dialog [3]. Da das Skript das Ergebnis in einer Variablen speichern soll, um damit im späteren Verlauf zu arbeiten, steht der Dialog innerhalb von geschweiften Klammern mit einem vorangestellten Dollar-Zeichen. So lässt sich die Ausgabe des Dialogs in der Variablen sp ablegen.

Mit dem Parameter --list erzeugt Zenity einen Auswahldialog, für den --title und --text jeweils eine sinnvolle Anzeige vorgeben. Dabei könnte im Parameter --text bereits der Inhalt einer längeren Zwischenablage hinterlegt sein, weswegen das Kommando cut 1-${laenge} den Ausgabetext auf maximal 80 Zeichen beschränkt.

Zeile 16 legt die Spaltenüberschrift fest. Darauf folgen die Einträge, jeweils innerhalb von Gänsefüßchen eingeschlossen. Der Inhalt beginnt stets mit SpeicherlfdNr, gefolgt von der Ausgabe des Inhalts der jeweiligen Textdatei per Cat-Befehl. Dabei reduziert der Cut-Befehl das Konglomerat auf die maximale Länge von 80 Zeichen.

Da jetzt bei einer Auswahl eine ziemlich lange Zeichenkette in der Variablen sp stehen würde, gilt es, unnötige Inhalte herauszuoperieren und auch Teile zu verändern. Am Anfang jeder Auswahl steht “Speicher”, gefolgt von einem Leerzeichen und der Nummer des Speicherplatzes. Der Sed-Befehl am Anfang von Zeile 27 ändert das “Speicher ” in “speicher” um. Dabei geben Sie explizit die erste Zeile als Adresse an, da es durchaus sein kann, dass die Zwischenablage mehrere Zeilen enthält: Dort könnte zufällig das Wort “Speicher” mit einem anschließenden Leerzeichen stehen und würde dann auch geändert.

Auch am Ende des S-Befehls von Sed steht noch einmal eine Eins, die bewirkt, dass das Programm lediglich das erste Vorkommen des gesuchten Ausdrucks ändert. Vom folgenden Inhalt der Zwischenablage selbst extrahiert in der zweiten Hälfte von Zeile 27 ein gezieltes Grep-Kommando nur die Inhalte, die in der Variablen sp im weiteren Verlauf des Skripts auch wirklich gebraucht werden – für den Anfang nur ein Wert von speicher1 bis speicher10.

Wilder Aktionismus

Eine Reihe von If-Abfragen prüft anschließend in den Zeilen 29 bis 39 den Inhalt der Variablen aktion, um dann eine von vier möglichen Aktionen mit den Inhalten der Zwischenablage vorzunehmen.

Die erste If-Abfrage greift, wenn Sie dem Skript als ersten Parameter belegen mitgegeben haben und im Zenity-Dialog ein Wert in der Variablen sp abgespeichert wurde. Bei der Prüfung kommt die verkürzte Form des Test-Kommandos zum Einsatz, bei der eckige Klammern der Bash signalisieren, dass hier ein Test erfolgt.

An dieser Stelle gibt das Skript einfach die Variable sp mithilfe des Kommandos echo -n (das einen Zeilenumbruch durch \n unterdrückt) aus und zählt über wc -m in der nächsten Station der Pipe die Anzahl der Worte im String. Bei nicht belegter Variable beträgt die Länge also null. So lässt sich prüfen, ob Sie im vorherigen Dialog eine Auswahl getroffen haben und das Skript fortfahren kann. Dann belegt es den angegebenen Speicherplatz mit dem aktuellen Inhalt der Zwischenablage.

Das zweite Elif (Zeile 31) kommt zum Zug, wenn Sie die Aktion abrufen gesetzt und im vorherigen Dialog eine Auswahl getroffen haben. In diesem Fall ruft das Skript nun den Xclip-Befehl auf und füllt so die Zwischenablage mit dem Inhalt des entsprechenden Speicherplatzes. Dabei kann Xclip die drei Bereiche XA_PRIMARY, XA_SECONDARY und XA_CLIPBOARD der Zwischenablage gesondert belegen.

Um Xclip mitzuteilen, welchen Teil der Zwischenablage Sie ansprechen möchten, stellt Xclip die Option -selection zur Verfügung. Entsprechend geben Sie im Folgenden entweder primary (Standard), secondary oder einfach clipboard an. Da nicht alle Fenstermanager und Anwendungen die Zwischenablage auf dieselbe Art und Weise belegen beziehungsweise abrufen, spricht das Skript alle drei Bereiche der Zwischenablage an (Zeilen 32 bis 34), damit der gewählte Text auch wirklich allen Programmen zur Verfügung steht.

Zeile 35 prüft, ob die Aktion löschen ansteht und Sie dazu auch tatsächlich einen Eintrag ausgewählt haben. In dem Fall bereinigt es den Inhalt des entsprechenden Speicherplatzes.

Zu guter Letzt kümmert sich die Zeile 37 um die Aktion bearbeiten. Zeile 38 übergibt dazu gegebenenfalls den Inhalt des ausgewählten Speicherplatzes an den eingangs in Zeile 2 definierten Texteditor.

Tastenkürzel

Um die Anwendung auch komfortabel zu nutzen und nicht jedes Mal über die Kommandozeile mit den jeweiligen Parametern aufrufen zu müssen, bedienen Sie sich einfach der Hilfe von Tastaturkombinationen, wie sie sich unter jedem Fenstermanager anlegen lassen.

Bei Gnome definieren Sie solche Shortcuts etwa unter Systemeinstellungen | Tastatur | Tastaturkürzel, bei KDE in ähnlicher Weise unter Systemeinstellungen | Erweitert | Tastenkombinationen. Bei anderen Fenstermanagern gelangen Sie typischerweise über den Punkt Tastatur zu den entsprechenden Einstellungen.

Den Pfad zum Skript müssen Sie dann zusammen mit einem der Parameter abrufen, belegen, löschen oder bearbeiten angeben. Sie legen also vier Shortcuts in etwa der Form wie in Listing 2 an (Abbildung 1). Nach der Definition der Shortcuts können Sie darangehen, die einzelnen Stellplätze zu befüllen.

Listing 2

/home/IhrVerzeichnis/zwischenablage.sh belegen
/home/IhrVerzeichnis/zwischenablage.sh abrufen
/home/IhrVerzeichnis/zwischenablage.sh löschen
/home/IhrVerzeichnis/zwischenablage.sh bearbeiten

Abbildung 1: So legen Sie Tastatur-Shortcuts für das Skript mit vier verschiedenen Parametern fest.

Abbildung 1: So legen Sie Tastatur-Shortcuts für das Skript mit vier verschiedenen Parametern fest.

Fazit

Sie verfügen nun über eine vollwertige Zwischenablage (Abbildung 2), die Sie nach Belieben erweitern und anpassen können. Beispielsweise könnten Sie weitere Speicherplätze hinzufügen, die etwa das aktuelle Datum, Ihre Kontaktdaten oder andere häufig benötigte Inhalte bereithalten. Mit Zenity und Xclip lässt sich das schnell realisieren und auf die Praxistauglichkeit hin abklopfen. Zudem lässt sich die Zwischenablage flexibel in allen Fenstermanagern einsetzen: Dazu müssen Sie lediglich die entsprechenden Tastatur-Shortcuts anlegen. 

Abbildung 2: Die Zwischenablage in Aktion, nachdem Sie den Shortcut für <code srcset=

belegen gedrückt haben: Ein Speicherplatz füllt sich mit dem aktuellen Wert der Zwischenablage.” width=”300″ height=”162″ /> Abbildung 2: Die Zwischenablage in Aktion, nachdem Sie den Shortcut für belegen gedrückt haben: Ein Speicherplatz füllt sich mit dem aktuellen Wert der Zwischenablage.

Infos

[1] Zenity: http://live.gnome.org/Zenity

[2] Xclip: http://xclip.sourceforge.net

[3] Shell-Skripts mit Zenity aufwerten: Harald Zisler, “Mehr Komfort”, LU 03/2014, S. 30, https://www.linux-community.de/29273

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 10/2014 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben