Ubuntu 16.04:如何通过终端向 Unity Launcher 添加/删除固定应用程序?

Ubuntu 16.04:如何通过终端向 Unity Launcher 添加/删除固定应用程序?

因此我在网上搜索了我的主题但没有找到任何答案。

有可能吗?如果可以,你能告诉我吗?谢谢 :)

答案1

内容:

  1. 发射器操作的一般理论
  2. 删除和附加到 Unity 启动器的可能方法
  3. launcherctl.py 实用程序

1. 发射装置运行的一般理论

Unity 启动器本质上是一个.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。这可以通过sedawk实用程序来完成,甚至在中也可以轻松完成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 getvia 管道的输出传递给 python。然后 Python 读取标准输入流并使用ast库评估列表的文本表示,并将其转换为 python 可以识别的实际列表。这大大简化了工作 - 如果这是 awk 或 sed,我们将不得不处理删除和附加单个字符。最后,我们sys.argv[1]通过在列表中找到它的索引来删除(pop)第二个命令行参数(由 表示)。我们现在有了新的列表,可以通过管道将其进一步传递给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

也可以用于删除文本文件中给出的项目

从按钮中删除第三项dash

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

获取源代码并安装

手动方式:

  1. 创建目录~/bin
  2. 将下面的源代码保存到文件中~/bin/launcherctl.py
  3. 如果您是bash用户,您可以 source ~/.profile,或者注销并登录。~/bin目录将$PATH自动添加到您的变量中。对于那些不使用的用户bash,请在您的 shell 配置文件中添加~/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: [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()

补充笔记:

答案2

要通过 GNOME 桌面管理器的终端更改固定应用程序,

获取当前固定应用程序列表:

gsettings get org.gnome.shell favorite-apps

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

将应用程序(例如 Sublime-Text)附加到 Dock:

gsettings set org.gnome.shell favorite-apps \
"['firefox.desktop','org.gnome.Nautilus.desktop',\
'org.gnome.Terminal.desktop','sublime-text_subl.desktop']"

相关内容