![强制应用程序窗口在其运行的工作区中打开](https://linux22.com/image/1533088/%E5%BC%BA%E5%88%B6%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%AA%97%E5%8F%A3%E5%9C%A8%E5%85%B6%E8%BF%90%E8%A1%8C%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8C%BA%E4%B8%AD%E6%89%93%E5%BC%80.png)
打开一个程序(例如 Anki 或 Slack)需要一两秒钟,而且我经常同时打开多个程序——在不同的工作区中。以下是我希望发生的事情:
- 按下
Mod + R
并输入“anki”Workspace 1
- 切换到
Workspace 2
按下Mod + R
并输入“discord” - 切换到
Workspace 3
按下Mod + R
并输入“libreoffice” - 切换到
Workspace 4
Firefox 并浏览 - 当我在查看时,Anki 打开了
Workspace 1
,Discord 打开了Workspace 2
,Libre Office 打开了。Workspace 3
Workspace 4
相反,最终发生的情况是,Workspace 4
无论我在运行它们时正在查看哪个工作区,Anki、Discord 和 Libre Office 都会在 中打开。
有没有办法实现上述情况没有必须明确地将程序分配给工作区?(例如,我可能并不总是想要 Anki Workspace 1
;我希望它在我输入“anki”时正在查看的任何工作区中打开。)
答案1
我把你的问题作为我今晚的任务,并设法得到了一个可行的版本。小心,它相当黑客化!据我所知,没有其他方法可以做到这一点。特别是因为有一个漏洞在应用规则方面非常出色。
我们在做什么?执行时,Mod4 + r
我们将当前聚焦的标签保存到列表中。当将规则应用于出现的窗口时,我们从列表中弹出相应的标签。我们需要 once 函数,因为 awesome 目前有一个错误,并且将规则应用于窗口两次。我们必须将我们的终端仿真器(以及我们用键绑定启动的所有其他程序)排除在外,否则它将在我们最后按下的标签上打开Mod4 + r
。
您的 rc.lua 中需要以下函数。
local rule_count = 0
local tag_count = 0
local run_tag = {}
local function once()
if rule_count == 1 then
rule_count = 0
else
rule_count = 1
end
return rule_count
end
local function get_run_tag()
if once() == 1 then
if tag_count > 0 then
tag_count = tag_count - 1
return table.remove(run_tag)
else
return "1"
end
end
end
local function push_run_tag(tag)
table.insert(run_tag, tag)
tag_count = tag_count + 1
end
然后在 rc.lua 中查找以下部分:
{ rule_any = {type = { "normal", "dialog" }},
properties = { titlebars_enabled = false } -- or true
},
并添加一些行,使其看起来像这样:
{ rule_any = {type = { "normal", "dialog" }},
except_any = { class = { "Termite" }},
properties = { titlebars_enabled = false, tag = function() return
get_run_tag() end}
},
您必须将其替换Termite
为您通常使用的控制台模拟器Mod4 + return
。此外,您还需要将每个程序添加到要使用键绑定启动的类表中。
然后寻找Mod4 + r
按键绑定。目前应该是这样的:
awful.key({ modkey }, "r", awful.screen.focused().mypromptbox:run()
{description = "run prompt", group = "launcher"}),
将其更改为如下所示:
awful.key({ modkey }, "r", function ()
awful.screen.focused().mypromptbox:run()
push_run_tag(awful.screen.focused().selected_tag.name)
end,
{description = "run prompt", group = "launcher"}),
我希望有更好的解决方案!
PS:这不适用于 Steam 等应用程序,因为它会弹出多个窗口。第一个窗口会获得正确的标签。以下窗口在标签“1”上生成。