Also habe ich das Netz zu meinem Thema durchsucht, aber keine Antwort gefunden.
Ist es möglich? Wenn ja, kannst du es mir bitte sagen? Danke 🙂
Akzeptierte Antwort:
Inhalt:
- Allgemeine Theorie des Launcher-Betriebs
- Mögliche Methoden zum Entfernen und Anhängen an Unity Launcher
- launcherctl.py-Dienstprogramm
1. Allgemeine Theorie des Launcher-Betriebs
Der Unity Launcher ist im Wesentlichen eine Liste von .desktop
Dateien. Sie sind im Wesentlichen Verknüpfungen, die das Starten von Anwendungen sowie das Ausführen benutzerdefinierter Aktionen ermöglichen. Normalerweise werden sie in /usr/share/applications
gespeichert , kann sich aber auch in ~/.local/share/applications
befinden , und überall sonst auf dem System. Für den allgemeinen Fall empfehle ich, solche Dateien in /usr/share/applications
zu speichern für alle Benutzer oder ~/.local/share/applications
für jeden einzelnen Benutzer.
Die Dconf
Die Einstellungsdatenbank ermöglicht das Speichern einer Liste solcher Apps für den Unity Launcher und kann mit gsettings
angezeigt und geändert werden Nützlichkeit. Zum Beispiel:
$ 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']
Wie Sie alle .desktop
sehen können Dateien haben application://
Präfix auf ihnen, es ist jedoch nicht erforderlich, wenn die Launcher-Liste festgelegt wird. Die Elemente mit unity://
Präfix sind nicht änderbar und können nicht entfernt werden.
Die gsettings get com.canonical.Unity.Launcher favorites
und gsettings set com.canonical.Unity.Launcher favorites
Befehle können verwendet werden, um Funktionen in Ihrem ~/.bashrc
zu erstellen , zum Beispiel:
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"
}
Beispiel:
$ set_launcher "['firefox.desktop','gnome-terminal.desktop']"
$ get_launcher
['application://firefox.desktop', 'application://gnome-terminal.desktop', 'unity://running-apps', 'unity://devices']
2. Mögliche Methoden zum Entfernen und Anhängen an Unity Launcher
Das einfachste Beispiel wurde bereits gezeigt – über gsettings
Nützlichkeit. Das Entfernen und Anhängen bestimmter Elemente erfordert das Analysieren der gsettings
Ausgang. Dies kann über sed
erfolgen oder awk
Utilities und mit Mühe sogar in bash
. Ich finde jedoch, dass Python den einfacheren Ansatz und den „Weg des geringsten Widerstands“ ermöglicht. Daher verwenden die hier bereitgestellten Beispiele gsettings
gemeinsam mit python.
Hier ist ein Fall von Entfernung:
$ 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']
Was passiert hier ? Wir übergeben die Ausgabe von gsettings get
über Pipe zu Python. Python liest dann den Standardeingabestrom und verwendet ast
Die Bibliothek wertet die Textdarstellung der Liste aus und konvertiert sie in eine tatsächliche Liste, die Python erkennen kann. Das vereinfacht die Arbeit enorm – wäre das awk oder sed, müssten wir uns mit dem Entfernen und Anhängen einzelner Zeichen befassen. Schließlich entfernen wir ( pop ) das zweite Befehlszeilenargument ( angegeben durch sys.argv[1]
), indem Sie seinen Index in der Liste finden. Wir haben jetzt eine neue Liste, die per Pipe an gsettings set
weitergereicht werden kann
Der vollständige Befehl lautet dann:
$ 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 {}
Was sich gut in eine ~/.bashrc
einfügen lässt funktionieren so:
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 {}
}
Ein paar Dinge, die hier zu beachten sind, sind, dass wir die in Anführungszeichen eingeschlossene „String“-Darstellung der Liste erneut drucken und über xargs
übergeben müssen . Die Idee mit dem Anhängen ist ähnlich, außer anstelle von pop
wir verwenden append
Funktion:
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 {}
}
Beispiellauf:
$ 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']
$
Diese Funktionen müssen nicht unbedingt Teil von ~/.bashrc
sein . Sie können sie auch in ein Skript einfügen
3. launcherctl.py-Dienstprogramm
Im Laufe der Zeit habe ich eine Reihe von Funktionen in Python recherchiert und erstellt, die effektiv dasselbe tun können wie gsettings
Nützlichkeit. Ich habe die Leistungsfähigkeit von Python mit diesen Funktionen kombiniert und launcherctl.py
erstellt Dienstprogramm.
Dies ist noch in Arbeit und wird in Zukunft um weitere Funktionen erweitert. Für diese spezielle Frage werde ich den Quellcode so belassen, wie er in der ersten Version erscheint. Weitere Versionen und Verbesserungen finden Sie auf GitHub.
Was sind die Vorteile dieses Skripts im Vergleich zu Bash-Funktionen?
1. Dies ist ein „zentralisiertes“ Dienstprogramm mit einem bestimmten Zweck. Sie müssen nicht für jede Aktion ein separates Skript/eine separate Funktion haben.
2. Einfach zu verwendende, minimalistische Befehlszeilenoptionen
3. Bei Verwendung in Verbindung mit anderen Dienstprogrammen sorgt dies für besser lesbaren Code .
Verwendung :
Wie durch das -h
gezeigt Befehlszeilenoption:
$ ./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
Die Verwendung der Befehlszeile ist einfach.
Anhängen:
$ ./launcherctl.py -a -f wechat.desktop
Entfernung:
$ ./launcherctl.py -r -f wechat.desktop
Launcher vollständig löschen:
$ ./launcherctl.py -c
Elemente im Launcher auflisten:
$ ./launcherctl.py -l
chromium-browser.desktop
firefox.desktop
opera.desktop
vivaldi-beta.desktop
Wie bereits erwähnt, kann es mit anderen Befehlen verwendet werden. Zum Beispiel Hinzufügen aus Datei:
$ cat new_list.txt
firefox.desktop
wechat.desktop
gnome-terminal.desktop
$ cat new_list.txt | xargs -L 1 launcherctl.py -a -f
Dasselbe kann beim Entfernen von Elementen aus einer Textdatei verwendet werden
Entfernen eines dritten Elements aus dem dash
Schaltfläche:
$ launcherctl.py -l | awk 'NR==3' | xargs -L 1 launcherctl.py -r -f
Quellcode erhalten und installieren
Manueller Weg:
- Erstellen Sie ein Verzeichnis
~/bin
. - Speichern Sie den Quellcode von unten in die Datei
~/bin/launcherctl.py
- Wenn Sie
bash
sind Benutzer, können Sie~/.profile
als Quelle verwenden , oder abmelden und anmelden. Der~/bin
Verzeichnis wird zu Ihrem$PATH
hinzugefügt automatisch variabel. Für diejenigen, diebash
nicht verwenden , fügen Sie~/bin
hinzu zu Ihrem$PATH
Variable in Ihrer Shell-Konfigurationsdatei, etwa so:PATH="$PATH:$HOME/bin
Wie ich bereits erwähnt habe, gehen die neuesten Änderungen am Code in das GitHub-Repository. Wenn Sie git
haben installiert, sind die Schritte einfacher:
git clone https://github.com/SergKolo/sergrep.git ~/bin/sergrep
echo "PATH=$PATH:$HOME/bin/sergrep" >> ~/.bashrc
source ~/.bashrc
. Nach diesem Schritt können Sielauncherctl.py
aufrufen wie jeder andere Befehl. Das Abrufen von Updates ist so einfach wiecd ~/bin/sergrep;git pull
Abrufen von Code von GitHub ohne git
:
cd /tmp
wget https://github.com/SergKolo/sergrep/archive/master.zip
unzip master.zip
- Wenn Sie
~/bin
nicht haben , machen Sie es mitmkdir ~/bin
mv sergrep-master/launcherctl.py ~/bin/launcherctl.py
In allen Fällen gelten dieselben Regeln – das Skript muss sich in einem Verzeichnis befinden, das zu PATH
hinzugefügt wird Variable und muss über ausführbare Berechtigungen verfügen, die mit chmod +x launcherctl.py
festgelegt wurden
Ursprünglicher Quellcode :
#!/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()
Zusätzliche Hinweise:
- In der Vergangenheit habe ich eine Antwort erstellt, die es ermöglicht, die Launcher-Liste aus der Datei festzulegen:https://askubuntu.com/a/761021/295286
- Ich habe auch einen Unity-Indikator zum Umschalten zwischen mehreren Listen erstellt. Siehe Anweisungen hier:http://www.omgubuntu.co.uk/2016/09/launcher-list-indicator-update-ppa-workspaces