Ubuntu 16.04: Как добавить / удалить закрепленные приложения в Unity Launcher через терминал?
Поэтому я искал в сети по своей теме, но я не нашел никакого ответа.
Является ли это возможным? Если да, подскажите, пожалуйста. Спасибо:)
1 ответ
Содержание:
- Общая теория работы ракеты-носителя
- Возможные способы удаления и добавления в лаунчер Unity
- утилита launcherctl.py
1. Общая теория работы пусковой установки
Unity Launcher по сути представляет собой список .desktop
файлы. По сути, это ярлыки, которые позволяют запускать приложения, а также выполнять пользовательские действия. Обычно они хранятся в /usr/share/applications
, но также может быть расположен в ~/.local/share/applications
и в любом другом месте системы. В общем случае я рекомендую хранить такие файлы в /usr/share/applications
для всех пользователей или ~/.local/share/applications
для каждого отдельного пользователя.
Dconf
База данных настроек позволяет хранить список таких приложений для запуска Unity и может быть просмотрена и изменена с 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. Возможные способы удаления и добавления в Unity Launcher
Простейший пример уже был показан - через gsettings
полезность. Удаление и добавление определенного элемента требует анализа gsettings
выход. Это можно сделать через sed
или же awk
коммунальные услуги, и с усилием даже в bash
, Тем не менее, я считаю, что питон позволяет более легкий подход и "путь наименьшего сопротивления". Таким образом, приведенные здесь примеры используют gsettings
совместно с питоном.
Вот случай удаления:
$ 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 читает стандартный поток ввода и использует ast
библиотека оценивает текстовое представление списка и преобразует его в реальный список, который может распознать python. Это значительно упрощает работу - если бы это был awk или sed, нам пришлось бы иметь дело с удалением и добавлением отдельных символов. Наконец, мы удаляем (pop) второй аргумент командной строки (обозначенный как 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 {}
Который можно красиво положить в ~/.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.
Каковы преимущества этого скрипта по сравнению с функциями bash? 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
Получение исходного кода и установка
Ручной способ:
- Создать каталог
~/bin
, - Сохранить исходный код снизу в файл
~/bin/launcherctl.py
- Если ты
bash
пользователь, вы можете источник~/.profile
или выйдите и войдите.~/bin
каталог будет добавлен в ваш$PATH
переменная автоматически. Для тех, кто не используетbash
, добавлять~/bin
на ваш$PATH
Переменная внутри вашего файла конфигурации оболочки, например:PATH="$PATH:$HOME/bin
Как я уже упоминал, последние изменения в коде идут в репозиторий GitHub. Если у вас есть git
установлены, шаги проще:
git clone https://github.com/SergKolo/sergrep.git ~/bin/sergrep
echo "PATH=$PATH:$HOME/bin/sergrep" >> ~/.bashrc
source ~/.bashrc
, После этого шага вы можете позвонитьlauncherctl.py
как любая другая команда. Получение обновлений так же просто, какcd ~/bin/sergrep;git pull
Получение кода из GitHub без git
:
cd /tmp
wget https://github.com/SergKolo/sergrep/archive/master.zip
unzip master.zip
- Если у вас нет
~/bin
сделай это сmkdir ~/bin
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()
Дополнительные примечания:
- В прошлом я создал ответ, который позволяет настроить список запуска из файла: /questions/91302/avtomatizatsiya-uporyadocheniya-ikonok-edinstva-zapuska/91309#91309
- Я также создал индикатор Unity для переключения между несколькими списками. Смотрите инструкции здесь: http://www.omgubuntu.co.uk/2016/09/launcher-list-indicator-update-ppa-workspaces
Я знаю, что это не отвечает на вопрос Unity, но я нашел этот ответ при поиске, чтобы изменить закрепленные приложения через терминал для менеджера рабочего стола GNOME.
Получить список текущих закрепленных приложений:
gsettings get org.gnome.shell favorite-apps
['firefox.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Terminal.desktop']
Добавить Sublime-Text в док:
gsettings set org.gnome.shell favorite-apps \
"['firefox.desktop','org.gnome.Nautilus.desktop',\
'org.gnome.Terminal.desktop','sublime-text_subl.desktop']"