我阅读了关于拥有单独桌面的各种答案文件夹在每个工作区中使用 Screenlets、devilspie 或 CCSM ... 但这不是我问题的答案。几天前我安装了 14.04 LTS,成功运行了大多数应用程序和一些新应用程序。我想要的是拥有 4 个独立的工作区,每个工作区都有一些不同的图标适用于我运行的环境。例如,
- 工作区 1 – 专用于科学和数学应用程序
- 工作区 2 – 专用于音乐工具
- 工作区 3 – 用于电子电路和模拟
- 工作区 4 – 用于网页浏览和常规计算
想象一下 Android 平板电脑,其中每个屏幕可以包含单独的图标。
如何做到这一点肯定很明显,但我找不到答案。我使用 Ubuntu 已经 4 天了,所以请不要以为我知道自己在做什么!
答案1
每个工作区设置不同的 Unity Launcher:
1. 2. 3. 4.
无论您有多少个工作区,下面的解决方案都可以轻松地为每个工作区设置一组不同的启动器图标。
设置包括两部分:
一个快捷键组合,用于“记住”当前工作区的启动器图标集。
在后台运行的脚本,跟踪当前工作区并设置相应的 Unity Launcher。每当用户切换工作区时,它都会起作用。
怎么运行的
涉及两个小脚本:
这第一的脚本只做一件简单的事情:它将当前启动器的内容写入主目录中的一个(隐藏)文件中,并以当前工作区命名(编号)。
这第二脚本会关注当前工作区。如果有工作区改变,脚本会查看是否存在相应的(启动器)数据文件(由第一个脚本创建)。如果存在,它会读取该文件并修改文件中记录的 Unity Launcher。
就是这样。
如何设置
wmctrl
需要安装脚本:sudo apt-get install wmctrl
创建一个目录,在其中两种脚本将被存储。重要的是将两个脚本保存在一个目录中,因为它们共享功能并且一个脚本从另一个脚本导入。出于同样的原因,重要的是您按如下所示准确命名它们。
将下面的每个脚本复制到(不同的)空文件中,并将它们保存到目录中(在中创建
2.
),确切地命名为:设置工作区.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()
启动器每个工作区.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
)添加到您选择的快捷键组合中:系统设置 > “键盘” > “快捷键” > “自定义快捷键”。单击“+”并添加命令:python3 /path/to/set_workspace.py
运行组合键并查看是否
.launcher_data_3
在您的主目录中创建了如下文件:。您可能需要按Ctrl+H以使文件可见(.
默认情况下,以 a 开头的文件是不可见的)。浏览您的工作区并重复该过程:设置启动器图标的组合,然后按下组合键来“记住”该特定工作区的设置。
现在您几乎已经完成了。使用以下命令测试运行后台脚本(从终端窗口,保持其运行):
python3 /path/to/launcher_perworkspace.py
如果一切正常,并且您的启动器按工作区切换,请将以下命令添加到您的启动应用程序:Dash > 启动应用程序 > 添加:
/bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
笔记
- 如果您想更改特定工作区的启动器图标集,只需导航到该工作区,根据需要添加/删除图标,然后按下组合键(无需重新启动后台脚本)。
- 从评论中我感觉大家对记住当前工作区当前启动器的快捷方式有些误解。你只需要一键盘快捷键“保存”当前工作区的当前启动器。无论您在哪个工作区,它的工作方式都完全相同。脚本本身将确定什么是当前工作区。
编辑
从您的评论中,我了解到您不确定是否运行脚本,并且担心会弄乱当前的启动器。
我非常确定,对于脚本所做的事情,这太过尊重了(或者太少了 :))。但是,您可以使用以下命令简单地备份当前的 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”中尝试过这个,但总是将两个启动器检查“嵌入”在两个工作区检查之间,结果证明这是在快速移动工作区时防止不良行为(保存不正确的数据)的技巧。
如何使用
与第一个版本一样,此脚本使用
wmctrl
:sudo apt-get 安装 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()
笔记
如果您使用先前版本的脚本设置了工作区,那么它们也适用于此版本。
电力供应协议
2015-04-23,Dennis J 的提问和 Parto 的鼓励促使我们ppa
为剧本创作了一个已在 webupd8 上介绍,包括一个用于管理它的GUI。
ppa:vlijm/lswitcher
要安装它,请运行:
sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher
从现在起,它已针对 Trusty 和 Utopic 进行了打包。我会在测试后添加其他版本。我还会添加一个.deb
安装程序,但我建议使用ppa
,因为这类东西通常会不时更新。
由于视口数据的位置已从 更改为~/
,~/.config/lswitcher
如果您使用了以前的脚本,则必须再次设置 Unity Launcher。