Ce serait une fonctionnalité géniale pour accéder aux documents récemment utilisés de LibreOffice avec une liste rapide dynamique dans le lanceur. Il y a ne certaine expérience sur la façon de créer des listes rapides personnalisées statiques .
Mais y a-t-il quelqu'un qui pourrait donner une orientation constructive sur la façon de créer une liste rapide dynamique pour les documents récemment utilisés?
Le wiki Ubuntu a un très brève description sur la création de listes rapides avec python ou vala. Je n'ai aucune expérience dans les deux domaines et je n'ai pas trouvé d'exemples complets de scripts pour des listes rapides dynamiques. Par conséquent, je cherche un moyen plus facile de le mettre en œuvre ou quelqu'un qui l'a déjà fait/vu.
L’intégration complète d’une application avec le liste rapide dynamique -entrées doit probablement être effectuée de l’intérieur de l’application. Après tout, les informations les plus directes sur les fichiers utilisés proviennent de l'application elle-même.
Cependant, puisque la modification du code source n’entre pas dans le cadre de nos travaux, ce n’est pas la voie à suivre.
alors quoi?
Cela ne signifie pas que nous ne pouvons pas obtenir à peu près exactement le même résultat, peut-être même de manière plus souple et plus générale, de "l'extérieur". Toutes les informations dont nous avons besoin sont disponibles dans le fichier mis à jour dynamiquement: ~/.local/share/recently-used.xbel
, à partir duquel nous pouvons récupérer l'historique complet des fichiers ouverts, les informations de date et heure correspondantes et l'application utilisée.
De plus, ajouter une section dynamiquement à un lanceur peut très bien être fait dans le cadre de la section "traditionnelle" (statique). La solution consiste alors à créer un processus prenant en charge les actions ci-dessus sans alourdir considérablement votre système.
Comme indiqué dans le lien de la question, n pe processus d'arrière-plan serait de toute façon nécessaire pour suivre les modifications et passer les instructions.
Le script ci-dessous fait exactement cela.
Les valeurs du script ci-dessous sont spécifiquement définies pour LibreOffice
et ses documents. Sans aucune modification, il peut être utilisé pour ajouter une section récemment utilisée à la LibreOffice-Writer
launcher. Il montrera les 10 derniers documents utilisés, ouverts par l’un des LibreOffice
-modules.
La solution peut toutefois être utilisée pour ajouter une section "récemment utilisée" à many applicatiosn avec un fichier .desktop
dans /usr/share/applications
. Étant donné que le fichier ~/.local/share/recently-used.xbel
est lié à Gtk
, les applications avec une fenêtre Gtk
seront probablement nos candidats potentiels (c'est-à-dire si l'application ouvre et modifie des fichiers). De plus, le nombre de fichiers à afficher est arbitraire.
La solution ajoute une section au lanceur ciblé dans le lanceur Unity, affichant un nombre arbitraire de fichiers récemment utilisés, par exemple:
affiche les sept derniers fichiers:
ou les dix derniers fichiers:
Avec la même facilité, nous pouvons cependant donner au lanceur gedit
une section dynamique, montrant les sept derniers fichiers, ouverte avec gedit
(voir l’image plus loin).
En supposant que LibreOffice soit préinstallé (la version téléchargée ne contient pas de fichier .desktop
de renvoi dans /usr/share/applications
qui est nécessaire au script, mais à un autre endroit, veuillez indiquer si vous devez configurer le logiciel séparément. version LO téléchargée)
Copiez le script ci-dessous dans un fichier vide, enregistrez-le sous le nom dynamic_recent.py
. Pour LibreOffice
, le nom du processus est soffice
, déjà défini correctement dans le script.
#!/usr/bin/env python3
import subprocess
import os
import time
import shutil
# --- set the number of docs to show in recently used
n = 7
# --- set the process name of the targeted application
application = "soffice"
#--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled
# else the value should be the same as in application = (above)
open_cmd = "soffice"
# --- set the targeted .desktop file (e.g. "gedit.desktop")
target = "libreoffice-writer.desktop"
# --- don't change anything below
home = os.environ["HOME"]+"/.local/share"
loc = home+"/applications/"+target
recdata = home+"/recently-used.xbel"
def runs(app):
try:
# see if the application is running
app = subprocess.check_output(["pgrep", app]).decode("utf-8")
except subprocess.CalledProcessError:
return False
else:
return True
def get_lines():
# retrieve information from the records:
# -> get bookmark line *if* the application is in the exec= line
with open(recdata) as infile:
db = []
for l in infile:
if '<bookmark href="file://' in l:
sub = l
Elif 'exec="''+application in l:
db.append(sub)
# fix bug in xbel -file in 15.04
relevant = [l.split('="') for l in set(db) if all([not "/tmp" in l, "." in l])]
relevant = [[it[1][7:-7], it[-2][:-10]] for it in relevant]
relevant.sort(key=lambda x: x[1])
return [item[0].replace("%20", " ") for item in relevant[::-1][:n]]
def create_section(line):
# create shortcut section
name = line.split("/")[-1]
return [[
"[Desktop Action "+name+"]",
"Name="+name,
"Exec="+open_cmd+" '"+line+"'",
"\n",
], name]
def setup_dirs():
# copy the global .desktop file to /usr/share/applications/
glo = "/usr/share/applications/"+target
if not os.path.exists(loc):
shutil.copy(glo,loc)
def edit_launcher(newdyn, target, actionlist):
# read the current .desktop file
ql = [list(item) for item in list(enumerate(open(loc).read().splitlines()))]
# find the Actions= line
currlinks = [l for l in ql if "Actions=" in l[1]]
# split the line (if it exists) by the divider as delimiter
linkline = currlinks[0][1].split("divider1")[0] if currlinks else None
# define the shortcut sections, belonging to the dynamic section (below the divider)
lowersection = [l for l in ql if "[Desktop Action divider1]" in l]
# compose the new Actions= line
addlinks = (";").join(actionlist) + ";"
if linkline:
newlinks = linkline + addlinks
ql[currlinks[0][0]][1] = newlinks
# get rid of the "dynamic" section
ql = ql[:lowersection[0][0]] if lowersection else ql
# define the new file
ql = [it[1] for it in ql]+newdyn
with open(loc, "wt") as out:
for l in ql:
out.write(l+"\n")
else:
newlinks = "Acrions="+addlinks
setup_dirs()
lines1 = []
while True:
time.sleep(2)
# if the application does not run, no need for a check of .xbel
if runs(application):
lines2 = get_lines()
# (only) if the list of recently used changed: edit the quicklist
if lines1 != lines2:
actionlist = ["divider1"]
newdyn = [
"[Desktop Action divider1]",
"Name=" + 37*".",
"\n",
]
for line in lines2:
data = create_section(line)
actionlist.append(data[1])
section = data[0]
for l in section:
newdyn.append(l)
edit_launcher(newdyn, target, actionlist)
lines1 = lines2
Dans la section head du script, vous pouvez définir plusieurs options:
# --- set the number of docs to show in recently used
n = 7
# --- set the process name of the targeted application
application = "soffice"
#--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled
# else the value should be the same as in application = (above)
open_cmd = "soffice"
# --- set the targeted .desktop file (e.g. "gedit.desktop")
target = "libreoffice-writer.desktop"
La plupart des options parlent d'elles-mêmes. Si vous souhaitez ajouter la section dynamique au lanceur LO-Writer
, laissez tout ce qu'il est. Sinon, définissez le lanceur approprié.
Test - lancez le script en exécutant depuis un terminal:
python3 /path/to/dynamic_recent.py
Le script a copié le fichier global .desktop
dans ~/.local/share/applications
(dans ce cas ~/.local/share/applications/libreoffice-writer.desktop
). Faites glisser la copie locale vers le programme de lancement (sinon, vous devrez vous déconnecter/entrer).
Si tout fonctionne correctement, ajoutez-le à Applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:
python3 /path/to/dynamic_recent.py
Comme indiqué, vous pouvez facilement utiliser le script pour ajouter une section dynamique "récemment utilisée" au (x) lanceur (s) d'une autre application. Pour ce faire, voir le paramètre exemple gedit
de la section head du script:
# --- set the number of docs to show in recently used
n = 7
# --- set the process name of the targeted application
application = "gedit"
#--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled
# else the value should be the same as in application = (above)
open_cmd = "gedit"
# --- set the targeted .desktop file (e.g. "gedit.desktop")
target = "gedit.desktop"
Le script examine périodiquement le fichier ~/.local/share/recently-used.xbel
pour rechercher les fichiers correspondants ouverts avec LibreOffice
(nom_processus: soffice
).
Pour ce faire, il utilise un algorithme assez rapide, consistant à "filmer" le fichier en un seul passage pour récupérer les lignes nécessaires (deux par "enregistrement"). Le résultat est que le script est très faible en jus.
Une fois que les lignes pertinentes sont extraites du fichier, elles sont triées par date/heure, ce qui crée un "top dix" (ou tout autre nombre) des fichiers les plus récemment utilisés de l'application correspondante.
.desktop
est mis à jour.Je pouvais remarquer ni mesurer une charge supplémentaire sur mon système en exécutant le script en arrière-plan.
Testé le 14.04/15.10
Supprimez simplement la copie locale du lanceur dans ~/.local/share/applications
Si vous utilisez nity Quicklist Editor pour éditer vos lanceurs (listes rapides), évitez de les éditer avec une section "mise à jour en permanence" mise à jour dynamiquement à partir de cette réponse. Les modifications que vous apportez avec l'éditeur QUicklist seront immédiatement écrasées par le script.
Vous pouvez modifier votre liste rapide manuellement, mais assurez-vous d’ajouter un nouvel élément before (à gauche de) divider1
dans la ligne Actions=
-
Actions=Window;Document;
diviseur1 ;aap.sh;Todo;pscript_2.py;currdate;bulkmail_llJacob;verhaal;test doc;
Tous les éléments à droite de divider1
appartiennent à la section mise à jour dynamiquement.
Quelques améliorations majeures viennent d'être apportées:
.xbel
pendant l'exécution de l'application ciblée (car la liste récemment utilisée ne sera pas modifiée si l'application ne s'exécute pas). Le script manquait déjà de ressources, mais maintenant, ne surveiller que si l'application s'exécute signifie encore moins pour votre système..xbel
contenait une double mention de nouveaux fichiers; une avec et une sans extension. L'effet de cela est maintenant éliminé.