我真的很喜欢 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)行为。
如何设置
wmctrl
需要安装脚本:sudo apt-get install wmctrl
将脚本复制到一个空文件中,保存为
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()
通过以下命令测试运行脚本:
python3 /path/to/numberlaunch.py 3
在您的示例图像中,这应该会提升或启动 Gimp
如果一切正常,请创建以下快捷方式,运行命令
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 内部编码的。其他设备可以读取,但由于它们在大多数情况下似乎是临时的(例如闪存驱动器),所以我暂时没有编写代码来读取信息。
- 由于快捷方式是自定义的,因此它不会展示要举起的图标的数量。正如你提到的,你需要记住它们。
您必须看看这些限制对您是否重要。