按字母顺序对 Unity Launcher 图标进行排序

我喜欢将我的锁定的启动器应用按字母顺序排序,我想知道是否有可能编写一个脚本来进行排序,这样每次添加新程序时我就不必自己手动排序了。
如果有一个包含所有图标名称和位置的文件夹,我应该能够从那里找到解决方法。

你的系统使用的是什么语言?最原始的排序方式是按照.desktop文件的名称进行排序,稍微复杂一些的方式是按照“通用”(主要是美式英语)名称进行排序,但应用程序也可能有本地化的名称。为了使其真正整洁,你(我)需要知道你的系统所使用的语言。 - Jacob Vlijm
我的语言设置为美式英语。 - Steven Albertson
2个回答

保持启动器按字母顺序排序

在后台运行下面的脚本(请参阅下面的说明)将使您的启动器按字母顺序从a到z进行排序:

在运行脚本之前,启动器中的前三个项目为:Gnome-terminal,Virtualbox,LibreOffice

enter image description here

运行脚本:dconf-editor,文件,Firefox

enter image description here

脚本的功能

应用程序的(界面)名称在.desktop文件中定义。这些文件可以存储在/usr/share/applications~/.local/share/applications中。如果存在本地文件,则后者会“覆盖”全局文件。

该脚本检查启动器列表中的更改,每两秒运行一次以下命令:

gsettings get com.canonical.Unity.Launcher favorites

这将返回一个按照当前启动器顺序排序的启动项列表。
如果启动器发生变化(例如添加新的启动器),脚本会在.desktop文件中查找相关接口名称(保留本地.desktop文件的优先级),并根据这些接口名称对启动项进行排序。
随后,脚本通过命令设置已排序的启动器。
gsettings set com.canonical.Unity.Launcher favorites "<sorted_launcheritems_list>"

如何使用

将以下脚本复制到一个空文件中,保存为sort_launcher.py
在终端中运行以下命令进行测试:
python3 /path/to/sort_launcher.py

如果一切正常,请将其添加到启动应用程序中:Dash > 启动应用程序 > 添加以下命令:
/bin/bash -c "sleep 15&&python3 /path/to/sort_launcher.py"

脚本

#!/usr/bin/env python3
import subprocess
import os
import time

home = os.environ["HOME"]
# define the two directories to search .desktop files, the string to identify application launchers
dir1 = "/usr/share/applications/"; dir2 = home+"/.local/share/applications/"; s = "application://"
# the key to read / write the launcher
lget = "gsettings get "; lset = "gsettings set "; key = "com.canonical.Unity.Launcher favorites"

# read current launcher
def read_current():
    return eval(subprocess.check_output(["/bin/bash", "-c", lget+key]).decode("utf-8").strip())

def sort_launcher(launchers):
    # split up launcher items in applications / others
    apps = []; others = []
    for it in launchers:
        apps.append(it) if it.startswith(s) else others.append(it)
    # create a sorted application (launcher-) list
    sort_list = []
    app_launchers = []
    for item in apps:
        check = get_interfacename(item)
        if check:
            app_launchers.append([check, item])
    app_launchers.sort(key=lambda x: x[0])
    # set the sorted launcher
    launcher_set = [item[1] for item in app_launchers]+others
    subprocess.Popen(["/bin/bash", "-c", lset+key+' "'+str(launcher_set)+'"'])

def get_interfacename(item):
    name = []
    for dr in [dir1, dir2]:
        subject = dr+item.replace(s, "")
        try:
            app = [l.strip() for l in open(subject).readlines() if l.startswith("Name=")][0]
            name.append(app)
        except FileNotFoundError:
            pass
        else:
            name.append(app)
            return name[-1].strip("Name=").lower()

# check every two seconds for changes, update launcher if necessary
current_launcher1 = read_current()
sort_launcher(current_launcher1)
while True:
    time.sleep(2)
    current_launcher2 = read_current()
    if current_launcher1 != current_launcher2:
        sort_launcher(current_launcher2)
    else:
        pass
    current_launcher1 = current_launcher2

注意事项

  • 脚本按照美式英语应用程序名称进行排序。
  • 在系统监视器中,脚本显示cpu 0%,这意味着脚本几乎不会增加处理器负载。

你可以使用它们

gsettings get com.canonical.Unity.Launcher favorites

并将它们设置为
gsettings set com.canonical.Unity.Launcher favorites VALUE

其中VALUE的格式与您从gsettings get ...获取的格式相同