web-dev-qa-db-fra.com

Comment puis-je ajouter une liste rapide dynamique spécifique à l'application pour les fichiers récemment utilisés dans Unity Launcher?

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.

4
joaoal

Ajout d'une section "récemment utilisée" dynamique au lanceur d'une application

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.

La solution; un script de fond

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-Writerlauncher. 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.

À quoi ça ressemble

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:

    enter image description here

  • ou les dix derniers fichiers:

    enter image description here

  • 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).

Comment utiliser

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)

  1. 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="&apos;'+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
    
  2. 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é.

  3. Test - lancez le script en exécutant depuis un terminal:

    python3 /path/to/dynamic_recent.py
    
  4. 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).

  5. 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
    

Pour l'utiliser sur d'autres applications

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"

enter image description here

Comment ça fonctionne

  • 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.

  • ONLY Si cette liste est modifiée, le fichier .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

Comment restaurer le lanceur d'origine

Supprimez simplement la copie locale du lanceur dans ~/.local/share/applications

Remarques

  • 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.


Modification majeure

Quelques améliorations majeures viennent d'être apportées:

  1. Le script maintenant seulement ​​vérifie le fichier .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.
  2. En 15.04+, le fichier .xbel contenait une double mention de nouveaux fichiers; une avec et une sans extension. L'effet de cela est maintenant éliminé.

4
Jacob Vlijm