因此我在网上搜索了我的主题但没有找到任何答案。
有可能吗?如果可以,你能告诉我吗?谢谢 :)
答案1
内容:
- 发射器操作的一般理论
- 删除和附加到 Unity 启动器的可能方法
- 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
。这可以通过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
via 管道的输出传递给 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
获取源代码并安装
手动方式:
- 创建目录
~/bin
。 - 将下面的源代码保存到文件中
~/bin/launcherctl.py
- 如果您是
bash
用户,您可以 source~/.profile
,或者注销并登录。~/bin
目录将$PATH
自动添加到您的变量中。对于那些不使用的用户bash
,请在您的 shell 配置文件中添加~/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: [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()
补充笔记:
- 过去我创建了一个允许从文件设置启动器列表的答案:https://askubuntu.com/a/761021/295286
- 我还创建了一个 Unity 指示器,用于在多个列表之间切换。请参阅此处的说明:http://www.omgubuntu.co.uk/2016/09/launcher-list-indicator-update-ppa-workspaces
答案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']"