GNU/Linux >> Znalost Linux >  >> Ubuntu

Ubuntu 16.04:Jak přidat/odebrat připnuté aplikace do Unity Launcher přes terminál?

tak jsem hledal na internetu své téma, ale nenašel jsem žádnou odpověď.

Je to možné? Pokud ano, můžete mi to prosím říct? Děkuji 🙂

Přijatá odpověď:

Obsah:

  1. Obecná teorie fungování Launcheru
  2. Možné způsoby odebrání a připojení ke spouštěči Unity
  3. nástroj launcherctl.py

1. Obecná teorie provozu odpalovacích zařízení

Spouštěč Unity je v podstatě seznam .desktop soubory. Jsou to v podstatě zkratky, které umožňují spouštění aplikací a také provádění vlastních akcí. Obvykle jsou uloženy v /usr/share/applications , ale může být také umístěn v ~/.local/share/applications a kdekoli jinde v systému. Pro obecný případ doporučuji uložit takové soubory do /usr/share/applications pro všechny uživatele nebo ~/.local/share/applications pro každého jednotlivého uživatele.

Soubor Dconf databáze nastavení umožňuje ukládat seznam takových aplikací pro spouštěč Unity a lze je prohlížet a měnit pomocí gsettings užitečnost. Například:

$ 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']

Jak můžete vidět všechny .desktop soubory mají application:// prefix na nich, není však vyžadován při nastavování seznamu launcherů. Položky s unity:// prefix nelze změnit a nelze je odstranit.

gsettings get com.canonical.Unity.Launcher favorites a gsettings set com.canonical.Unity.Launcher favorites příkazy lze použít k vytvoření funkcí ve vašem ~/.bashrc , například:

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"
}

Příklad:

$ set_launcher "['firefox.desktop','gnome-terminal.desktop']"                                                                         
$ get_launcher                                                                                                                        
['application://firefox.desktop', 'application://gnome-terminal.desktop', 'unity://running-apps', 'unity://devices']

2. Možné způsoby odebrání a připojení k Unity Launcher

Nejjednodušší příklad již byl ukázán – prostřednictvím gsettings užitečnost. Odebrání a připojení konkrétní položky vyžaduje analýzu gsettings výstup. To lze provést pomocí sed nebo awk utility a s námahou i v bash . Zjistil jsem však, že python umožňuje snazší přístup a „cestu nejmenšího odporu“. Zde uvedené příklady tedy používají gsettings společně s pythonem.

Zde je případ odstranění:

$ 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']

Co se tady děje ? Předáme výstup gsettings get přes potrubí do pythonu. Python pak čte standardní vstupní proud pomocí ast knihovna vyhodnotí textovou reprezentaci seznamu a převede jej na skutečný seznam, který python dokáže rozpoznat. To značně zjednodušuje práci – pokud by to bylo awk nebo sed, museli bychom řešit odstraňování a připojování jednotlivých znaků. Nakonec odstraníme ( pop ) druhý argument příkazového řádku (označený sys.argv[1] ) vyhledáním jeho indexu v seznamu. Nyní máme nový seznam, který lze dále předávat pomocí potrubí do gsettings set

Úplný příkaz je pak tento:

$ 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 {}

Což lze pěkně vložit do ~/.bashrc fungovat takto:

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 {}
}

Zde je několik věcí, které je třeba poznamenat, že musíme znovu vytisknout „řetězcovou“ reprezentaci seznamu uzavřenou v uvozovkách a předat ji přes xargs . Myšlenka s připojením je podobná, pouze místo pop používáme append funkce:

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 {}

}

Ukázkový běh:

$ 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']
$ 

Tyto funkce nemusí být nutně součástí ~/.bashrc . Můžete je také umístit do skriptu

3. nástroj launcherctl.py

Postupem času jsem prozkoumal a vytvořil sadu funkcí v pythonu, které mohou efektivně dělat to samé jako gsettings užitečnost. Spojením síly pythonu s těmito funkcemi jsem vytvořil launcherctl.py utility.

Související:Nainstalován ovladač pro Intel HD, ale hry si stále stěžují, že 3D není podporováno?

Toto je ve vývoji a v budoucnu bude rozšířeno o další funkce. U této konkrétní otázky ponechám zdrojový kód tak, jak je uveden v první verzi. Další verze a vylepšení najdete na GitHubu.

Jaké jsou výhody tohoto skriptu ve srovnání s bash funkcemi?
1. Toto je „centralizovaný“ nástroj se specifickým účelem. Nemusíte mít samostatný skript/funkci pro každou akci.
2. Jednoduché použití, minimalistické možnosti příkazového řádku
3. Při použití ve spojení s jinými nástroji to poskytuje čitelnější kód .

Využití :

Jak ukazuje -h možnost příkazového řádku:

$ ./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

Použití příkazového řádku je jednoduché.

Připojování:

$ ./launcherctl.py -a -f wechat.desktop

Odstranění:

$ ./launcherctl.py -r -f wechat.desktop

Úplné vymazání spouštěče:

$ ./launcherctl.py -c 

Výpis položek na spouštěči:

$ ./launcherctl.py -l                                                                                                                 
chromium-browser.desktop
firefox.desktop
opera.desktop
vivaldi-beta.desktop

Jak již bylo zmíněno, lze jej použít s jinými příkazy. Například přidání ze souboru:

$ cat new_list.txt                                                                                                                    
firefox.desktop
wechat.desktop
gnome-terminal.desktop    
$ cat new_list.txt | xargs -L 1 launcherctl.py -a -f

Totéž lze použít s odstraněním položek uvedených z textového souboru

Odebrání 3. položky z dash tlačítko:

$ launcherctl.py  -l | awk 'NR==3' | xargs -L 1 launcherctl.py -r -f  

Získání zdrojového kódu a instalace

Ruční způsob:

  1. Vytvořte adresář ~/bin .
  2. Uložte zdrojový kód níže do souboru ~/bin/launcherctl.py
  3. Pokud jste bash uživatel, můžete zdroj ~/.profile nebo se odhlaste a přihlaste. ~/bin adresář bude přidán do vaší $PATH měnit automaticky. Pro ty, kteří nepoužívají bash , přidejte ~/bin do vaší $PATH proměnná uvnitř konfiguračního souboru shellu, například takto:PATH="$PATH:$HOME/bin

Jak jsem zmínil, nejnovější změny v kódu jdou do úložiště GitHub. Pokud máte git nainstalován, kroky jsou jednodušší:

  1. git clone https://github.com/SergKolo/sergrep.git ~/bin/sergrep
  2. echo "PATH=$PATH:$HOME/bin/sergrep" >> ~/.bashrc
  3. source ~/.bashrc . Po tomto kroku můžete zavolat launcherctl.py jako jakýkoli jiný příkaz. Získání aktualizací je stejně jednoduché jako cd ~/bin/sergrep;git pull

Získání kódu z GitHubu bez git :

  1. cd /tmp
  2. wget https://github.com/SergKolo/sergrep/archive/master.zip
  3. unzip master.zip
  4. Pokud nemáte ~/bin , vytvořte jej pomocí mkdir ~/bin
  5. mv sergrep-master/launcherctl.py ~/bin/launcherctl.py

Ve všech případech platí stejná pravidla – skript musí žít v adresáři, který je přidán do PATH proměnná a musí mít oprávnění ke spuštění nastavena pomocí chmod +x launcherctl.py

Původní zdrojový kód :

#!/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()

Další poznámky:

  • v minulosti jsem vytvořil odpověď, která umožňuje nastavení seznamu spouštěčů ze souboru:https://askubuntu.com/a/761021/295286
  • Vytvořil jsem také indikátor Unity pro přepínání mezi více seznamy. Pokyny naleznete zde:http://www.omgubuntu.co.uk/2016/09/launcher-list-indicator-update-ppa-workspaces
Související:Žádný zvuk v Ubuntu 13.04, uvedeno pouze výstupní zařízení Dumthe?
Ubuntu
  1. Jak přidat odkládací soubor na Ubuntu

  2. Jak přidat tiskárnu v Ubuntu 11.10 | Přidejte tiskárnu v Ubuntu

  3. Jak nainstalovat emulátor terminálu Alacritty přes PPA v Ubuntu 20.04

  1. Jak odstranit spouštěč Amazon dash na Ubuntu 20.04 Focal Fossa Linux

  2. Jak otevřít terminál v Ubuntu 22.04

  3. Jak odebrat plochu Unity z Ubuntu 17.10

  1. Jak přidat a odebrat uživatele na Ubuntu 20.04

  2. Jak vytvořit více profilů pro Unity launcher v Ubuntu pomocí launcher-list-indicator

  3. Jak odstranit osiřelé balíčky na Ubuntu