问题描述
我阅读了使用 Screenlets、devilspie 或 CCSM 在每个工作区中拥有单独的桌面文件夹的各种答案……但这不是我问题的答案。几天前我安装了 14.04 LTS,并在运行我的大部分应用程序和一些新应用程序方面取得了巨大成功。我想要的是有 4 个独立的工作区,每个工作区都有一些用于我运行的环境的不同图标。例如,
-
Workspace 1 – 专门用于科学和数学应用程序
-
Workspace 2 – 专用于音乐工具
-
工作区 3 – 用于电子电路和模拟
-
Workspace 4 – 用于网页浏览和通用计算
想想每个屏幕都可以包含单独图标的 Android 平板电脑。
如何做到这一点一定很明显,但我找不到答案。我在 Ubuntu 上已经 4 天了,所以请不要以为我知道我在做什么!
最佳回答
为每个工作区设置不同的 Unity Launcher:
1. 2. 3. 4.
无论您有多少工作区,下面的解决方案都可以轻松地为每个工作区拥有一组不同的启动器图标。
设置包括两部分:
-
A(一个)快捷键组合到 “remember” 当前工作区的启动器图标集。
-
在后台运行的脚本,跟踪当前工作区并设置相应的 Unity Launcher。每当用户切换工作区时,它都会起作用。
这个怎么运作
涉及两个小脚本:
第一个脚本做了一件简单的事情:它将当前启动器的内容写入主目录中的(隐藏)文件,以当前工作空间命名(编号)。
第二个脚本密切关注当前工作区是什么。如果工作空间发生变化,脚本会查看是否存在相应的(启动器)数据文件(由第一个脚本创建)。如果是这样,它会读取文件并更改 Unity Launcher,如文件中所记。
而已。
如何设置
-
该脚本需要安装
wmctrl
:sudo apt-get install wmctrl
-
创建一个目录,这两个脚本都将存储在其中。将两个脚本放在一个目录中很重要,因为它们共享功能并且一个从另一个导入。出于同样的原因,请务必按照下面的说明准确命名它们。
-
将下面的每个脚本复制到一个(不同的)空文件中,将它们保存到目录中(在
2.
中创建),完全命名为:set_workspace.py
#!/usr/bin/env python3 import subprocess import os workspace_data = os.environ["HOME"]+"/.launcher_data_" key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"] def get_res(): # get resolution xr = subprocess.check_output(["xrandr"]).decode("utf-8").split() pos = xr.index("current") return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )] def current(): # get the current viewport res = get_res() vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split() dt = [int(n) for n in vp_data[3].split("x")] cols = int(dt[0]/res[0]) curr_vpdata = [int(n) for n in vp_data[5].split(",")] curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1]) return str(curr_col+curr_row*cols) def remember_current(): currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip() f = workspace_data+current() open(f, "w").write(currlauncher) if __name__ == "__main__": remember_current()
launcher_perworkspace.py
#!/usr/bin/env python3 import subprocess import set_workspace import time workspace_data = set_workspace.workspace_data key = set_workspace.key def check_datafile(desktop): f = workspace_data+str(desktop) try: new_launcher = open(f).read() command = key[1]+key[2]+' "'+str(new_launcher)+'"' subprocess.Popen(["/bin/bash", "-c", command]) except FileNotFoundError: pass curr_dt1 = set_workspace.current() check_datafile(curr_dt1) while True: time.sleep(1) curr_dt2 = set_workspace.current() if curr_dt2 != curr_dt1: check_datafile(curr_dt2) curr_dt1 = curr_dt2
-
将第一个脚本 (
set_workspace.py
) 添加到您选择的快捷键组合中:系统设置 > “Keyboard” > “Shortcuts” > “Custom Shortcuts”。单击 “+” 并添加命令:python3 /path/to/set_workspace.py
-
运行组合键并查看是否在您的主目录中创建了一个文件,例如:
.launcher_data_3
。您可能需要按Ctrl
+H
使文件可见(默认情况下,以.
开头的文件是不可见的)。浏览您的工作区并重复该过程:设置启动器图标的组合,然后按您的组合键到 “remember” 该特定工作区的集合。 -
你现在几乎完成了。 Test-run 带有命令的后台脚本(从终端窗口,保持运行):
python3 /path/to/launcher_perworkspace.py
如果一切正常,并且您的启动器在每个工作区切换,请将以下命令添加到您的启动应用程序:Dash >启动应用程序 >添加:
/bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
说明
-
如果要更改特定工作区的启动器图标集,只需导航到工作区,根据需要添加/删除图标,然后按组合键(无需重新启动后台脚本)。
-
从评论中,我感觉对记住当前工作区的当前启动器的快捷方式存在一些误解。您只需要一个键盘快捷键来 “save” 当前工作区的当前启动器。无论您在哪个工作区,它都将完全一样地工作。脚本本身将确定当前工作区是什么。
Edit
从您的评论中,我了解到您不确定是否运行脚本,并且您担心会弄乱当前的启动器。
我很确定这是对脚本所做的太多(或太少:))的尊重。但是,您可以使用以下命令简单地备份当前的 Unity Launcher:
printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output
这将创建一个文件 ~/launcher_output
,其中包含将 Unity Launcher 恢复到初始状态的完整命令。在紧急情况下,只需复制文件的内容并将其粘贴到终端中即可。
但是同样,除非您手动更改脚本,否则您不太可能会弄乱您的启动器。
重要编辑 (2)
根据评论中的要求,特此运行的版本无需使用任何快捷方式组合;只需运行脚本并开始在特定工作区上设置启动器。该脚本将在您的主目录中创建(不可见)文件,以记住您在不同工作区上的一组(Unity-)启动器。
我在脚本的“版本 1”中尝试了这个,但总是 “embedding” 两个 workspace-checks 之间的两个 launcher-checks 被证明是在快速通过工作区时防止不需要的行为(保存不正确的数据)的技巧。
如何使用
-
与第一个版本一样,此脚本使用
wmctrl
: sudo apt-get install wmctrl -
将脚本复制到一个空文件中,保存为
launcher_toworkspace.py
-
使用以下命令运行它:
python3 /path/to/launcher_toworkspace.py
-
如果它按预期工作,请将以下命令添加到您的启动应用程序:
/bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
剧本
#!/usr/bin/env python3
import subprocess
import os
import time
datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"
key = [
"gsettings get ",
"gsettings set ",
"com.canonical.Unity.Launcher favorites",
]
def get_launcher():
return subprocess.check_output(
["/bin/bash", "-c", key[0]+key[2]]
).decode("utf-8").strip()
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def current():
# get the current viewport
res = get_res()
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])+1
curr_row = int(curr_vpdata[1]/res[1])
return str(curr_col+curr_row*cols)
curr_ws1 = current()
currlauncher1 = get_launcher()
while True:
time.sleep(1)
currlauncher2 = get_launcher()
curr_ws2 = current()
datafile = workspace_data+curr_ws2
if curr_ws2 == curr_ws1:
if currlauncher2 != currlauncher1:
open(datafile, "wt").write(currlauncher2)
else:
if not os.path.exists(datafile):
open(datafile, "wt").write(currlauncher2)
else:
curr_set = open(datafile).read()
command = key[1]+key[2]+' "'+str(curr_set)+'"'
subprocess.Popen(["/bin/bash", "-c", command])
curr_ws1 = curr_ws2
currlauncher1 = get_launcher()
说明
如果您使用先前版本的脚本设置工作区,它们也应该适用于此版本。
PPA
根据 2015-04-23,Dennis J 的好问题和 Parto 的鼓励,导致为脚本 covered on webupd8 创建了一个 ppa
,包括一个用于管理它的 GUI。
ppa:vlijm/lswitcher
要安装它,请运行:
sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher
从现在开始,它被打包为 Trusty &乌托邦。我会在测试后添加其他人。我还将添加一个 .deb
安装程序,但我建议使用 ppa
,因为通常这种东西会不时更新。
由于视口数据的位置已从 ~/
更改为 ~/.config/lswitcher
,如果您使用之前的脚本,则必须再次设置 Unity Launcher。