简而言之:当我切换到工作区X时,我希望某些程序自动启动,但前提是它们尚未启动。
这与不同工作区上的 XMonad 启动不同,因为我不想将窗口移动到特定的工作区(就像总是将 xterm 移动到工作区 2(。
这对我也不起作用:xmonad 在不同的工作区中启动时生成。我不希望所有应用程序在我登录时立即启动,如果我关闭它并再次切换到工作区 2,这也不会自动启动,例如 xterm。
关于不起作用的内容已经足够了,这是有效的
:(几乎(
在我的工作区列表中,我保留了带有工作区名称和列表的程序,以便在我在那里切换时启动:
myWorkspaces = [ ("VIM", ["gvim"]), ("TERM",[myTerminal ++ " -e tmux"]) ]
-- In my keybindings:
[ ((mod4Mask, key), loadWorkspace workspace cmd)
| (key, (workspace, cmd)) <- zip [xK_1..] myWorkspaces
]
我定义了一个函数来切换到工作区并生成给定的程序:
loadWorkspace :: String -> [String] -> X()
loadWorkspace workspace commands =
do windows $ W.greedyView workspace
mapM_ spawn filtered_commands
where filtered_commands :: X [String]
filtered_commands = filterM isNotOpen commands
isNotOpen :: String -> X Bool
isNotOpen command = return True
(出于某种原因mapM_
要求第二个参数是字符串而不是[字符串]。我想在filtered_commands的字符串上映射spawn
,知道为什么这不起作用吗?
最后一个缺失的部分是isNotOpen
函数,它应该搜索当前工作区中窗口的className
,并返回command
是否已经存在。
我发现(与其他语言和技术相比(搜索XMonad的做事方式非常困难。对于这种情况,我只能找到如何在当前的WS - https://superuser.com/a/852152/481701 中获取窗口。好的,我想,这给了我一个 Window 对象,我可以查询它以获取一些属性。
但是没有。窗口实际上是...Word64
!!!的别名好的,我想。Googlexmonad 获取窗口属性。无。XMONAD 从窗口 ID 获取类名。无。XMONAD 窗口信息。还有其他十几种说类似的话的方法 - 没有有用的结果。我得到的只是xmonad主页,FAQ或"Xmonad配置提示"。
我也在hayoo!中尝试了这些,我能得到的最接近的是"fromClassName - 根据它的className为窗口着色"。哈哈。
那么,如何在ManageHook之外获取窗口的类名(或任何其他属性(呢?
您可能喜欢动态项目或主题空间作为预烘焙的替代方案。它们并不完全按照您的建议进行操作,但也许其中一个足够接近,仍然有用,并且需要较少的配置工作。
我想在filtered_commands的字符串上映射生成,知道为什么这不起作用吗?
是的,您需要提升mapM_
来处理一元参数(而不是一元函数或返回值(。因此:
filtered_commands >>= mapM_ spawn
或者,由于您已经在do
块中:
result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands
那么,如何在
ManageHook
之外获取窗口的className
(或任何其他属性(?
看看className
的来源:
className = ask >>= (w -> liftX $ withDisplay $ d -> fmap resClass $ io $ getClassHint d w)
您可以将要liftX
的参数作为X
操作,而不是Query
操作。关键功能是从 X11 封装中getClassHint
的。该包还提供对窗口其他属性的访问。
安装 wmctrl
sudo apt install wmctrl
并创建一个脚本(在本例中为第二个工作区上的 thunderbird (-t 1
((:
#!/bin/sh
(thunderbird &) & sleep 5 &&
sh -c "wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"
要在 wmctrl 上知道您的应用程序名称,您可以通过点击您的终端来查看它:
wmctrl -l
并将其替换为脚本中的正确名称。
用大写字母装满("雷鸟"而不是"雷鸟"(!!
在 3D 工作区上使用 Firefox 的其他示例 (-t 2
(:
#!/bin/sh
(firefox &) & sleep 5 &&
sh -c "wmctrl -i -r `wmctrl -l | grep Firefox` -t 2"
奖金:
这是启动时要执行的命令:
sh -c "thunderbird & sleep 5 && wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"
与肉桂一起制作Debain 10。但应该为所有人工作