Unity 启动器快捷方式,用于未指定数字的图标

Unity 启动器快捷方式,用于未指定数字的图标

我真的很喜欢 Unity 启动器,特别是我可以用 Super+[0-9] 轻松切换到(或打开)我熟悉的应用程序(而不必对所有打开的选项卡按 Alt+Tab 直到找到我打开的应用程序)。

使用相同的固定应用程序一段时间后,人们就能完美地记住哪个数字对应哪个应用程序(1 代表文件、2 代表浏览器、3 代表终端等),当我在它们之间切换时,我感觉自己就像一个忍者。

事实是,现在,使用了 10 个默认插槽(从数字 0 到 9),例如,我想将字母分配给其余图标(没有分配数字的图标):

我希望分配的信件

我只是想知道这是否可能,如果可以的话我可以在哪里找到一些文档或一些指南(到目前为止我找不到任何东西)。

首先十分感谢。

附言:抱歉,照片质量不好;我尝试截取屏幕截图,但按下 Super 键裁剪区域时数字并没有出现。

答案1

使用编号快捷方式 > 10

默认情况下,Super+(number)限制为 10。通过一些小技巧,我们可以扩展它。下面的脚本可以使用任何数字作为参数运行,然后激活相应的启动器图标+ 10

实践中的一个例子:

在此处输入图片描述

与往常一样,Super+1激活启动器中的第一个图标

  • 现在当我按下Alt Super+时1,第 11 个图标被激活
  • 当我按下Alt Super+时2,第 12 个图标被激活

...等等

怎么运行的

  • 该脚本使用以下命令读取当前启动器:

    gsettings get com.canonical.Unity.Launcher favorites
    
  • 由于每个图标(如果是应用程序的图标)都代表 或 中的一个文件.desktop,因此脚本会在相应文件中查找命令。[但是这些命令可以采用不同的形式,出于简单原因,我不会在这里解释。]/user/share/applications~/.local/share/applications.desktop

  • 随后,脚本会尝试调出应用程序可能存在的窗口。如果失败,则应用程序显然未运行,并且脚本会启动该应用程序,类似于通常的Super+(number)行为。

如何设置

  1. wmctrl需要安装脚本:

    sudo apt-get install wmctrl
    
  2. 将脚本复制到一个空文件中,保存为numberlaunch.py

    #!/usr/bin/env python3
    import subprocess
    import os
    import sys
    
    dir1 = os.path.join(os.environ["HOME"], ".local/share/applications")
    dir2 = "/usr/share/applications"
    
    index = int(sys.argv[1])+9
    
    def get_file(dr, app):
        try:
            return [os.path.join(dr, dt) for dt in os.listdir(dr) if dt in app][0]
        except IndexError:
            pass
    
    def clean_command(cmd):
        for s in ["%U", "%u", "%F", "%f"]:
            cmd = cmd.replace(s, "")
        return (cmd.strip())
    
    def check_windowtype(wid):
        w_data = subprocess.check_output(["xprop", "-id", wid]).decode("utf-8")
        return not "_NET_WM_WINDOW_TYPE_DESKTOP" in w_data
    
    def get_window(appname):
        try:
            pid = subprocess.check_output(["pgrep", appname]).decode("utf-8").strip()
        except subprocess.CalledProcessError:
            return False
        else:
            wlist = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()
            try:
                wmatch = [w.split()[0] for w in wlist if pid in w]
                relevant = [wid for wid in wmatch if check_windowtype(wid) == True][0]            
                subprocess.Popen(["wmctrl", "-ia", relevant])
                return True
            except IndexError:
                return False
    
    def raise_app():
        app = current_launcher()[index]
        f = get_file(dir1, app)
        f = f if f else get_file(dir2, app)
        cmd = [l.strip().split("=")[1] for l in open(f).readlines() if "Exec" in l][0]
        cmd = clean_command(cmd); tryraise = cmd.split()[0]
        tryraise = "soffice.bin" if tryraise == "libreoffice" else tryraise
        if get_window(tryraise)  == False:
            subprocess.Popen(cmd.split())
    
    def current_launcher():
        get_current = subprocess.check_output(["gsettings", "get", "com.canonical.Unity.Launcher", "favorites"]).decode("utf-8")
        return [item for item in eval(get_current) if any([
            "device://" in item, "application://" in item,
            ])]
    
    raise_app()
    
  3. 通过以下命令测试运行脚本:

    python3 /path/to/numberlaunch.py 3
    

    在您的示例图像中,这应该会提升或启动 Gimp

  4. 如果一切正常,请创建以下快捷方式,运行命令

    Alt Super+ 1,运行命令:

    python3 /path/to/numberlaunch.py 1
    

    Alt Super+ 2,运行命令:

    python3 /path/to/numberlaunch.py 2
    

    Alt Super+ 3,运行命令:

    python3 /path/to/numberlaunch.py 3
    

    ...等等

    注意:使用快捷方式时,请确保不是如果您这样做,在.Super之前按下的键将优先于其他键。如果这让您感到困扰,请选择其他快捷键,例如:AltSuper

    Ctrl+ Alt+(number)

限制

不幸的是,存在一些限制:

  • 脚本仅“看到”锁定在启动器上的图标。不确定这对您来说是否是个问题,因为在您的示例中,启动器 11 及以后的启动器似乎已锁定在启动器上。
  • 该脚本不会启动锁定到启动器的网络快捷方式或设备。原因是网络条目不会在列出启动器的命令中提供任何有用的信息(类似“-”)。不确定是否可以检索信息,或者它是在 Unity 内部编码的。其他设备可以读取,但由于它们在大多数情况下似乎是临时的(例如闪存驱动器),所以我暂时没有编写代码来读取信息。
  • 由于快捷方式是自定义的,因此它不会展示要举起的图标的数量。正如你提到的,你需要记住它们。

您必须看看这些限制对您是否重要。

相关内容