Ubuntu 16.04: Как я добавляю/удаляю прикрепленные приложения к Средству запуска Единицы через терминал?

таким образом, я искал сеть по своей теме, но я не нашел ответа.

Действительно ли это возможно? Если да, можно сказать мне? Спасибо :)

2
задан 24 September 2016 в 17:51

2 ответа

Содержание:

  1. Общая теория эксплуатации Средства запуска
  2. Возможные способы удалить и добавить к средству запуска Единицы
  3. утилита launcherctl.py

1. Общая теория эксплуатации средства запуска

Средство запуска Единицы по существу является списком .desktop файлы. Они - по существу ярлыки, которые позволяют запускать приложения, а также выполнять пользовательские действия. Обычно они хранятся в /usr/share/applications , но может быть также расположен в ~/.local/share/applications, и где-либо еще в системе. Для общего случая я рекомендую хранить такие файлы в /usr/share/applications для всех пользователей или ~/.local/share/applications для каждого отдельного пользователя.

Dconf база данных настроек позволяет хранить список таких приложений для средства запуска Единицы и может быть просмотрена и изменена с gsettings утилита. Например:

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

Поскольку Вы видите весь .desktop файлы имеют application:// префикс на них, однако это не требуется при установке списка средства запуска. Объекты с unity:// префикс не изменяем и не может быть удален.

gsettings get com.canonical.Unity.Launcher favorites и gsettings set com.canonical.Unity.Launcher favorites команды могут использоваться для создания функций в Вашем ~/.bashrc , например:

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

Пример:

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

2. Возможные способы удалить и добавить к Средству запуска Единицы

Самый простой пример уже показали - через gsettings утилита. Удаление и добавление определенного объекта требуют парсинга gsettings вывод. Это может быть сделано через sed или awk утилиты, и с усилием даже в bash. Однако я нахожу, что Python позволяет более легкий подход и "путь наименьшего сопротивления". Таким образом примеры, обеспеченные здесь, используют gsettings совместно с Python.

Вот случай удаления:

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

Что происходит здесь? Мы передаем вывод gsettings get через канал к Python. Python затем читает стандартный входной поток и использование ast библиотека оценивает текстовое представление списка и преобразовывает его в фактический список, который может распознать Python. Это значительно упрощает работу - если бы это было awk или sed, то мы должны были бы иметь дело с удалением и добавлением отдельных символов. Наконец, мы удаляем (выталкивают) второй параметр командной строки (обозначенный sys.argv[1] ) путем нахождения это - индекс в списке. У нас теперь есть новый список, который может быть передан далее через канал к gsettings set

Полная команда - затем это:

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

Который может быть приятно помещен в a ~/.bashrc функционируйте как так:

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

Несколько вещей отметить вот состоят в том, что мы должны распечатать снова "строковое" представление списка, включенного в кавычки, и передать его через xargs. Идея с добавлением подобна, кроме вместо pop мы используем append функция:

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

}

Образец выполняется:

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

Эти функции должны не обязательно быть частью ~/.bashrc. Можно разместить их в сценарий также

3. утилита launcherctl.py

Со временем я исследовал и создаю ряд функций в Python, который может эффективно сделать то же как gsettings утилита. Помещая питание Python вместе с теми функциями, я сделал launcherctl.py утилита.

Это - происходящая работа и будет расширено для включения большего количества функций в будущее. Для этого конкретного вопроса я оставлю исходный код, как это появляется в первой версии. Дальнейшие версии и улучшения могут быть найдены на GitHub.

Каковы преимущества этого сценария, сравненного с функциями удара? 1. Это - "централизованная" утилита с определенной целью. У Вас не должно быть отдельного сценария/функции для каждого действия. 2. Простой использовать, минималистские параметры командной строки 3. При использовании в сочетании с другими утилитами это предусматривает больше читаемого кода.

Использование:

Как показано -h параметр командной строки:

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

Использование командной строки просто.

Добавление:

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

Удаление:

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

Очистка средства запуска полностью:

$ ./launcherctl.py -c 

Список объектов на средстве запуска:

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

Как упомянуто прежде, это может использоваться с другими командами. Например, добавление из файла:

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

То же может использоваться с удалением объектов, данных от текстового файла

Удаление 3-го объекта от dash кнопка:

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

Получение исходного кода и установки

Ручной путь:

  1. Создайте каталог ~/bin.
  2. Сохраните исходный код снизу в файл ~/bin/launcherctl.py
  3. Если Вы bash пользователь, можно получить ~/.profile, или выход из системы и вход в систему. ~/bin каталог будет добавлен к Вашему $PATH переменная автоматически. Для тех, кто не использует bash , добавить ~/bin к Вашему $PATH переменная в Вашем конфигурационном файле оболочки, как так: PATH="$PATH:$HOME/bin

Поскольку я упомянул, что последние изменения в коде входят в репозиторий GitHub. Если Вы имеете git установленный, шаги более просты:

  1. git clone https://github.com/SergKolo/sergrep.git ~/bin/sergrep
  2. echo "PATH=$PATH:$HOME/bin/sergrep" >> ~/.bashrc
  3. source ~/.bashrc. После этого шага можно звонить launcherctl.py как любая другая команда. Получение обновлений так же просто как cd ~/bin/sergrep;git pull

Получение кода от GitHub без git:

  1. cd /tmp
  2. wget https://github.com/SergKolo/sergrep/archive/master.zip
  3. unzip master.zip
  4. Если Вы не имеете ~/bin , сделайте его с mkdir ~/bin
  5. mv sergrep-master/launcherctl.py ~/bin/launcherctl.py

Во всех случаях те же правила применяются - сценарий должен жить в каталоге, который добавляется к PATH переменной и нужно было установить исполняемые полномочия с chmod +x launcherctl.py


Код первоисточника:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#
# Author: Serg Kolo , contact: 1047481448@qq.com
# 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()

Дополнительные примечания:

6
ответ дан 2 December 2019 в 01:43

Для изменения прикрепленных приложений через терминал для среды рабочего стола GNOME,

Получают список текущих прикрепленных приложений:

gsettings get org.gnome.shell favorite-apps

['firefox.desktop', 'org.gnome. Nautilus.desktop', 'org.gnome. Terminal.desktop']

Добавляют приложение (например, сублимированный текст) для прикрепления:

gsettings set org.gnome.shell favorite-apps \
"['firefox.desktop','org.gnome.Nautilus.desktop',\
'org.gnome.Terminal.desktop','sublime-text_subl.desktop']"
0
ответ дан 2 December 2019 в 01:43

Другие вопросы по тегам:

Похожие вопросы: