j'ai donc cherché sur le net mon sujet mais je n'ai pas trouvé de réponse.
C'est possible? Si oui, pouvez-vous me dire s'il vous plaît? Merci 🙂
Réponse acceptée :
Contenu :
- Théorie générale du fonctionnement du lanceur
- Méthodes possibles de suppression et d'ajout au lanceur Unity
- utilitaire launcherctl.py
1. Théorie générale du fonctionnement du lanceur
Le lanceur Unity est essentiellement une liste de .desktop
des dossiers. Ce sont essentiellement des raccourcis qui permettent de lancer des applications ainsi que d'effectuer des actions personnalisées. Généralement, ils sont stockés dans /usr/share/applications
, mais peut également être situé dans ~/.local/share/applications
, et n'importe où ailleurs sur le système. Pour le cas général, je recommande de stocker ces fichiers dans /usr/share/applications
pour tous les utilisateurs ou ~/.local/share/applications
pour chaque utilisateur individuel.
Le Dconf
la base de données des paramètres permet de stocker la liste de ces applications pour le lanceur Unity et peut être visualisée et modifiée avec gsettings
utilitaire. Par exemple :
$ gsettings get com.canonical.Unity.Launcher favorites
['application://wps-office-et.desktop', 'application://wps-office-wpp.desktop', 'application://wps-office-wps.desktop', 'unity://running-apps', 'unity://devices']
$ gsettings set com.canonical.Unity.Launcher favorites "['wechat.desktop']"
$ gsettings get com.canonical.Unity.Launcher favorites
['application://wechat.desktop', 'unity://running-apps', 'unity://devices']
Comme vous pouvez le voir tous les .desktop
les fichiers ont application://
préfixe sur eux, mais il n'est pas nécessaire lors de la définition de la liste des lanceurs. Les éléments avec unity://
préfixe ne sont pas modifiables et ne peuvent pas être supprimés.
Les gsettings get com.canonical.Unity.Launcher favorites
et gsettings set com.canonical.Unity.Launcher favorites
les commandes peuvent être utilisées pour créer des fonctions dans votre ~/.bashrc
, par exemple :
get_launcher()
{
gsettings get com.canonical.Unity.Launcher favorites
}
set_launcher()
{
# call this as set_launcher "['file1.desktop','file2.desktop']"
gsettings set com.canonical.Unity.Launcher favorites "$1"
}
Exemple :
$ set_launcher "['firefox.desktop','gnome-terminal.desktop']"
$ get_launcher
['application://firefox.desktop', 'application://gnome-terminal.desktop', 'unity://running-apps', 'unity://devices']
2. Méthodes possibles de suppression et d'ajout à Unity Launcher
L'exemple le plus simple a déjà été montré - via gsettings
utilitaire. La suppression et l'ajout d'un élément spécifique nécessite l'analyse des gsettings
production. Cela peut être fait via sed
ou awk
utilitaires, et avec effort même dans bash
. Cependant, je trouve que python permet l'approche la plus facile et le "chemin de moindre résistance". Ainsi, les exemples fournis ici utilisent gsettings
conjointement avec python.
Voici un cas de suppression :
$ gsettings get com.canonical.Unity.Launcher favorites|
> python -c 'import ast,sys; x =[]; x = [i for l in sys.stdin for i in ast.literal_eval(l)];
> x.pop(x.index("application://"+sys.argv[1])); print x' firefox.desktop
['application://gnome-terminal.desktop', 'unity://running-apps', 'unity://devices']
Que se passe-t-il ici ? Nous transmettons la sortie du gsettings get
via un tuyau vers python. Python lit ensuite le flux d'entrée standard et utilise ast
La bibliothèque évalue la représentation textuelle de la liste et la convertit en une liste réelle que Python peut reconnaître. Cela simplifie grandement le travail - si c'était awk ou sed, nous devrions nous occuper de supprimer et d'ajouter des caractères individuels. Enfin, nous supprimons (pop) le deuxième argument de la ligne de commande (indiqué par sys.argv[1]
) en trouvant son index dans la liste. Nous avons maintenant une nouvelle liste, qui peut être transmise via un tube à gsettings set
La commande complète est alors celle-ci :
$ gsettings get com.canonical.Unity.Launcher favorites|
> python -c 'import ast,sys; x =[]; x = [i for l in sys.stdin for i in ast.literal_eval(l)];
> x.pop(x.index("application://"+sys.argv[1])); print "\""+repr(x)+"\""' firefox.desktop |
> xargs -I {} gsettings set com.canonical.Unity.Launcher favorites {}
Qui peut être joliment mis dans un ~/.bashrc
fonctionner comme ceci :
remove_launcher_item()
{
gsettings get com.canonical.Unity.Launcher favorites|
python -c 'import ast,sys; x =[]; x = [i for l in sys.stdin for i in ast.literal_eval(l)];\
x.pop(x.index("application://"+sys.argv[1])); print "\""+repr(x)+"\""' "$1" |
xargs -I {} gsettings set com.canonical.Unity.Launcher favorites {}
}
Quelques points à noter ici sont que nous devons imprimer à nouveau la représentation "chaîne" de la liste entre guillemets et la transmettre via xargs
. L'idée avec l'ajout est similaire, sauf qu'au lieu de pop
nous utilisons append
fonction :
append_launcher_item()
{
gsettings get com.canonical.Unity.Launcher favorites|
python -c 'import ast,sys; x =[]; x = [i for l in sys.stdin for i in ast.literal_eval(l)];\
x.append("application://"+sys.argv[1]); print "\""+repr(x)+"\""' "$1" |
xargs -I {} gsettings set com.canonical.Unity.Launcher favorites {}
}
Exemple d'exécution :
$ get_launcher
['unity://running-apps', 'unity://devices', 'application://firefox.desktop']
$ append_launcher_item gnome-terminal.desktop
$ get_launcher
['unity://running-apps', 'unity://devices', 'application://firefox.desktop', 'application://gnome-terminal.desktop']
$
Ces fonctions ne doivent pas nécessairement faire partie de ~/.bashrc
. Vous pouvez également les placer dans un script
3. utilitaire launcherctl.py
Au fil du temps, j'ai recherché et créé un ensemble de fonctions en python qui peuvent effectivement faire la même chose que gsettings
utilitaire. En associant la puissance de python à ces fonctions, j'ai créé launcherctl.py
utilitaire.
Il s'agit d'un travail en cours et sera élargi pour inclure plus de fonctions à l'avenir. Pour cette question spécifique, je laisserai le code source tel qu'il apparaît dans la première version. D'autres versions et améliorations sont disponibles sur GitHub.
Quels sont les avantages de ce script par rapport aux fonctions bash ?
1. Il s'agit d'un utilitaire "centralisé" avec un objectif spécifique. Vous n'avez pas besoin d'avoir un script/fonction séparé pour chaque action.
2. Options de ligne de commande simples à utiliser
3. Lorsqu'il est utilisé en conjonction avec d'autres utilitaires, cela fournit un code plus lisible .
Utilisation :
Comme indiqué par le -h
option de ligne de commande :
$ ./launcherctl.py -h
usage: launcherctl.py [-h] [-f FILE] [-a] [-r] [-l] [-c]
Copyright 2016. Sergiy Kolodyazhnyy.
This command line utility allows appending and removing items
from Unity launcher, as well as listing and clearing the
Launcher items.
--file option is required for --append and --remove
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE
-a, --append
-r, --remove
-l, --list
-c, --clear
L'utilisation de la ligne de commande est simple.
Ajout :
$ ./launcherctl.py -a -f wechat.desktop
Suppression :
$ ./launcherctl.py -r -f wechat.desktop
Vider complètement le lanceur :
$ ./launcherctl.py -c
Liste des éléments sur le lanceur :
$ ./launcherctl.py -l
chromium-browser.desktop
firefox.desktop
opera.desktop
vivaldi-beta.desktop
Comme mentionné précédemment, il peut être utilisé avec d'autres commandes. Par exemple, en ajoutant à partir du fichier :
$ cat new_list.txt
firefox.desktop
wechat.desktop
gnome-terminal.desktop
$ cat new_list.txt | xargs -L 1 launcherctl.py -a -f
La même chose peut être utilisée avec la suppression d'éléments donnés à partir d'un fichier texte
Suppression d'un 3ème élément du dash
bouton :
$ launcherctl.py -l | awk 'NR==3' | xargs -L 1 launcherctl.py -r -f
Obtention du code source et installation
Manière manuelle :
- Créer un répertoire
~/bin
. - Enregistrer le code source ci-dessous dans le fichier
~/bin/launcherctl.py
- Si vous êtes
bash
utilisateur, vous pouvez source~/.profile
, ou se déconnecter et se connecter. Le~/bin
répertoire sera ajouté à votre$PATH
variable automatiquement. Pour ceux qui n'utilisent pasbash
, ajoutez~/bin
à votre$PATH
variable dans votre fichier de configuration du shell, comme ceci :PATH="$PATH:$HOME/bin
Comme je l'ai mentionné, les dernières modifications apportées au code vont dans le référentiel GitHub. Si vous avez git
installé, les étapes sont plus simples :
git clone https://github.com/SergKolo/sergrep.git ~/bin/sergrep
echo "PATH=$PATH:$HOME/bin/sergrep" >> ~/.bashrc
source ~/.bashrc
. Après cette étape, vous pouvez appelerlauncherctl.py
comme toute autre commande. Obtenir des mises à jour est aussi simple quecd ~/bin/sergrep;git pull
Obtenir du code de GitHub sans git
:
cd /tmp
wget https://github.com/SergKolo/sergrep/archive/master.zip
unzip master.zip
- Si vous n'avez pas
~/bin
, faites-le avecmkdir ~/bin
mv sergrep-master/launcherctl.py ~/bin/launcherctl.py
Dans tous les cas, les mêmes règles s'appliquent - le script doit résider dans un répertoire ajouté à PATH
variable et doit avoir des autorisations exécutables définies avec chmod +x launcherctl.py
Code source d'origine :
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Author: Serg Kolo , contact: [email protected]
# Date: Sept 24, 2016
# Purpose: command-line utility for controling the launcher
# settings
# Tested on: Ubuntu 16.04 LTS
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import gi
from gi.repository import Gio
import argparse
import sys
def gsettings_get(schema, path, key):
"""Get value of gsettings schema"""
if path is None:
gsettings = Gio.Settings.new(schema)
else:
gsettings = Gio.Settings.new_with_path(schema, path)
return gsettings.get_value(key)
def gsettings_set(schema, path, key, value):
"""Set value of gsettings schema"""
if path is None:
gsettings = Gio.Settings.new(schema)
else:
gsettings = Gio.Settings.new_with_path(schema, path)
if isinstance(value,list ):
return gsettings.set_strv(key, value)
if isinstance(value,int):
return gsettings.set_int(key, value)
def puts_error(string):
sys.stderr.write(string+"\n")
sys.exit(1)
def list_items():
""" lists all applications pinned to launcher """
schema = 'com.canonical.Unity.Launcher'
path = None
key = 'favorites'
items = list(gsettings_get(schema,path,key))
for item in items:
if 'application://' in item:
print(item.replace("application://","").lstrip())
def append_item(item):
""" appends specific item to launcher """
schema = 'com.canonical.Unity.Launcher'
path = None
key = 'favorites'
items = list(gsettings_get(schema,path,key))
if not item.endswith(".desktop"):
puts_error( ">>> Bad file.Must have .desktop extension!!!")
items.append('application://' + item)
gsettings_set(schema,path,key,items)
def remove_item(item):
""" removes specific item from launcher """
schema = 'com.canonical.Unity.Launcher'
path = None
key = 'favorites'
items = list(gsettings_get(schema,path,key))
if not item.endswith(".desktop"):
puts_error(">>> Bad file. Must have .desktop extension!!!")
items.pop(items.index('application://'+item))
gsettings_set(schema,path,key,items)
def clear_all():
""" clears the launcher completely """
schema = 'com.canonical.Unity.Launcher'
path = None
key = 'favorites'
gsettings_set(schema,path,key,[])
def parse_args():
"""parse command line arguments"""
info="""Copyright 2016. Sergiy Kolodyazhnyy.
This command line utility allows appending and removing items
from Unity launcher, as well as listing and clearing the
Launcher items.
--file option is required for --append and --remove
"""
arg_parser = argparse.ArgumentParser(
description=info,
formatter_class=argparse.RawTextHelpFormatter)
arg_parser.add_argument('-f','--file',action='store',
type=str,required=False)
arg_parser.add_argument('-a','--append',
action='store_true',required=False)
arg_parser.add_argument('-r','--remove',
action='store_true',required=False)
arg_parser.add_argument('-l','--list',
action='store_true',required=False)
arg_parser.add_argument('-c','--clear',
action='store_true',required=False)
return arg_parser.parse_args()
def main():
""" Defines program entry point """
args = parse_args()
if args.list:
list_items()
sys.exit(0)
if args.append:
if not args.file:
puts_error(">>>Specify .desktop file with --file option")
append_item(args.file)
sys.exit(0)
if args.remove:
if not args.file:
puts_error(">>>Specify .desktop file with --file option")
remove_item(args.file)
sys.exit(0)
if args.clear:
clear_all()
sys.exit(0)
sys.exit(0)
if __name__ == '__main__':
main()
Remarques supplémentaires :
- dans le passé, j'ai créé une réponse qui permet de définir la liste des lanceurs à partir du fichier :https://askubuntu.com/a/761021/295286
- J'ai également créé un indicateur Unity pour basculer entre plusieurs listes. Voir les instructions ici :http://www.omgubuntu.co.uk/2016/09/launcher-list-indicator-update-ppa-workspaces