Guten Abend sehr geehrte ubuntuusers Gemeinde,
ich hätte gerne eine dynamische Quicklist für Libreoffice im Unity Startmenü. Diese soll die zuletzt geöffneten Dokumente anzeigen. Da ich in den weiten des Internets nicht fündig geworden bin, habe ich angefangen selbst zu eine Lösung entwickleln ☺
Für alle, die immernoch nicht wissen, was das ganze überhaupt sein soll (man kann irgendwie keinen Screenshot machen, wenn man Rechtsklick auf ein Menüicon gemacht hat, deswegen Handyfoto):
Dieses Makro ist nicht verfügbar
So, nun wollte ich ein bash script schreiben, welches die zuletzt geöffneten Dokumente ausliest und anschließend eine entsprechende .desktop Datei schreibt. Die entsprechenden Informationen kann man ja
~/.config/libreoffice/3/user/registrymodifications.xcu
entnehmen. Der Zugriff darauf erfolgt per xmllint.
Der Starter selbst muss wohl auch noch ein Script werden, damit nach dem Beenden einer Libreoffice Anwendung die aktuell zuletzt geöffneten Dokumente geschrieben werden können.
Stand jetzt funktioniert: Ich kann die entsprechende Dateinamen auslesen und in eine .desktop Datei schreiben. Diese enthält einen statischen Teil, über den die einzelnen Libreoffice Anwendungen gestartet werden können und halt einen dynamischen mit den Dokumenten.
Was nicht funktioniert: Dateien, die Leerzeichen oder Umlaute enthalten bekommen falsche Pfade.
Ansonsten ist wohl vieles Verbesserungswürdig. Habe das erste mal mit xmllint und bash Programmierung zu tun gehabt. Besonders die String Manipulation hat mir immer wieder Rätsel aufgegeben.
Darüber hinaus wäre es wohl schöner, wenn eine vorhandene .desktop Datei angepasst wird, anstatt immer komplett neu zu schreiben. Aber das habe ich nicht hinbekommen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #!/bin/bash #Wenn mit Parameter gestartet, entsprechende Datei öffnen. #Nach Beenden von Libreoffice 3 Sekunden warten, um vorzubeugen, dass die zuletzt geöffneten Dokumente noch nicht geschrieben wurden. if [ $# -gt 0 ] then libreoffice "$1" sleep 3 fi #Per xmllint die zuletzt geöffneten Dokumente ermitteln xmlStr=$(echo 'cat //item[@*[local-name()='"'path'"']="/org.openoffice.Office.Histories/Histories/org.openoffice.Office.Histories:HistoryInfo['"'PickList'"']/ItemList"]/node/@*[local-name()='"'name'"']' | xmllint --shell ~/.config/libreoffice/3/user/registrymodifications.xcu) #index eines SubStrings ermitteln strindex() { x="${1%%$2*}" [[ $x = $1 ]] && index=-1 || index=${#x} } #Dateinamen aus String filtern frontPattern="file://" endPattern='"' arrIndex=0 strindex "$xmlStr" "$frontPattern" fileNameStart=$index #Und in ein Array schreiben while [ $fileNameStart -gt 0 ] do xmlStr=${xmlStr:$fileNameStart + 7} strindex "$xmlStr" "$endPattern" fileNameEnd=$index files[$arrIndex]=${xmlStr:0:$fileNameEnd} xmlStr=${xmlStr:$fileNameEnd} strindex "$xmlStr" "$frontPattern" fileNameStart=$index files[$arrIndex]=${files[$arrIndex]//%C3%84/Ä} files[$arrIndex]=${files[$arrIndex]//%C3%96/Ö} files[$arrIndex]=${files[$arrIndex]//%C3%9C/Ü} files[$arrIndex]=${files[$arrIndex]//%C3%A4/ä} files[$arrIndex]=${files[$arrIndex]//%C3%B6/ö} files[$arrIndex]=${files[$arrIndex]//%C3%BC/ü} files[$arrIndex]=${files[$arrIndex]//%20/ } #echo ${files[$arrIndex]} arrIndex=$[arrIndex + 1] done #.desktop Datei schreiben libreDesktopFile="${HOME}/.local/share/applications/libreoffice.desktop" content="[Desktop Entry]\n Version=1.0\n Terminal=false\n Icon=libreoffice-startcenter\n Type=Application\n Categories=Office;X-Red-Hat-Base;X-SuSE-Core-Office;X-MandrivaLinux-Office-Other;\n Exec=libreoffice %U\n MimeType=application/vnd.openofficeorg.extension;\n Name=LibreOffice \n GenericName=Office \n GenericName[zu]=Ihhovisi\n Comment=The office productivity suite compatible to the open and standardized ODF document format. Supported by The Document Foundation.\n Comment[zu]=The office productivity suite compatible to the open and standardized ODF document format. Supported by The Document Foundation.\n \n X-Ayatana-Desktop-Shortcuts=Calc;Writer;Impress;Draw;" counter=0; for i in "${files[@]}" do content="$content""$counter;" counter=$[counter + 1] done content="$content \n [Calc Shortcut Group]\n Name=Calc\n Exec=${HOME}/libreoffice-dynamic-quicklist.sh -calc %U\n TargetEnvironment=Unity\n \n [Writer Shortcut Group]\n Name=Writer\n Exec=${HOME}/libreoffice-dynamic-quicklist.sh -writer %U\n TargetEnvironment=Unity\n \n [Impress Shortcut Group]\n Name=Impress\n Exec=${HOME}/libreoffice-dynamic-quicklist.sh -impress %U\n TargetEnvironment=Unity\n \n [Draw Shortcut Group]\n Name=Draw\n Exec=${HOME}/libreoffice-dynamic-quicklist.sh -draw %U\n TargetEnvironment=Unity\n" counter=0; for i in "${files[@]}" do content="$content""\n [$counter Shortcut Group]\n Name=$i\n Exec=${HOME}/libreoffice-dynamic-quicklist.sh '$i'\n TargetEnvironment=Unity\n" counter=$[counter + 1] done echo -e $content > $libreDesktopFile |
Ansonsten wollte ich das erstmal hier zum Besten geben, damit andere Leute, die sich vielleicht Ähnliches wünschen einen Ansatz haben und wir unser Wissen bündeln können ☺
Für Kritik, Anregungen und Fragen bin ich gerne offen. Werde die Tage noch damit weiter machen, aber vorher schaue ich mir glaub ich ein wenig das grundsätzliche Handwerkszeug der bash Programmierung an.
Schönen Abend noch.
Edit: So, hab nun soweit alles gefixed (Leerzeichen, Umlaute). Ob es schön, effizient oder sonstwas gelöst ist weiß ich nicht. Bei mir funktioniert jetzt jedenfalls alles.
Wenn es jemand testen will:
Script im Home Verzeichnis ablegen
mit sudo chmod +x libreoffice-dynamic-quicklist.sh ausführbar machen
einmal von der Konsole per ./libreoffice-dynamic-quicklist.sh starten
nun die erstellte libreoffice.desktop im Verzeichnis ~/.local/share/applications/ in den Starter ziehen
von nun an kann man die zuletzt geöffneten Dokumente per Rechtsklick aus der Quicklist wählen
Wenn man nun natürlich Dokumente über den Dateimanager öffnet oder Libreoffice über einen anderen Weg startet, wird die Quicklist erst upgedatet, wenn man diesen Starter wieder benutzt hat oder das Script manuell ausführt.
Hoffe es nutzt jemanden. Über Kritik, Anregungen und Fragen würde ich mich wie gesagt freuen.