简而言之:当我切换到工作区 X 时,我希望某些程序能够自动启动,但前提是它们尚未启动。
这与XMonad startup on different workspaces不同,因为我不想将窗口移动到特定的工作区(例如总是将xterm移动到工作区2)。
这对我来说不起作用:xmonad spawn on startup in different workspace。我不希望所有应用程序在我登录时立即启动,这也不会自动启动,例如xterm如果我关闭它并再次切换到工作区2。
足够的东西不起作用, 的工作原理如下:
<子>(几乎)子>
在我的工作区列表中,我使用工作区名称和列表程序进行操作,以便在切换时启动:
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_
要求第二个参数是 String 而不是 [String] 。我想将spawn
映射到 filtered_commands 中的字符串,知道为什么这不起作用?)
最后一个缺失的部分是isNotOpen
函数,该函数应搜索当前工作空间中窗口的className
并返回command
是否已存在。
我发现搜索XMonad做事的方式非常困难(与其他语言和技术相比)。在这种情况下,我只能找到如何在当前的WS中获取窗口 - https://superuser.com/a/852152/481701。好吧,我想,这给了我一个Window对象,我可以查询它的一些属性。
但不是。窗口实际上是Word64
的别名!!!好的,我想。 Google xmonad获取窗口属性。没有。 xmonad从窗口ID获取classname 。没有。 xmonad窗口信息。还有十几种其他方式可以说出相似之处 - 没有任何有用的结果。我得到的只是xmonad主页,FAQ或“Xmonad配置提示”
我也在 hayoo!中尝试了这些,我最接近的是“fromClassName - 根据它的className着色一个窗口。”。哈哈。
答案 0 :(得分:4)
您可能希望dynamic projects或topic spaces作为预先烘焙的替代品。他们没有完全你的建议,但也许其中一个足够接近仍然有用,并且需要较少的配置工作。
我想在filtered_commands中的字符串上映射spawn,知道为什么这不起作用?
是的,您需要提升mapM_
来处理monadic参数(而不是monadic函数或返回值)。因此:
filtered_commands >>= mapM_ spawn
或者,因为您已经在do
区块中:
result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands
那么,我怎样才能在
className
之外获得一个窗口的ManageHook
(或任何其他属性)?
className = ask >>= (\w -> liftX $ withDisplay $ \d -> fmap resClass $ io $ getClassHint d w)
您只需将参数liftX
作为X
操作而不是Query
操作。关键功能是来自X11包的getClassHint
,它还提供对windows的其他属性的访问。
答案 1 :(得分:0)
安装wmctrl
sudo apt install wmctrl
并创建一个脚本(在本示例中,第二个工作区(-t 1
上是雷鸟):
#!/bin/sh
(thunderbird &) & sleep 5 &&
sh -c "wmctrl -i -r `wmctrl -l | grep Thunderbird` -t 1"
要知道您在wmctrl上的应用程序名称,可以通过在终端上点击来查看它:
wmctrl -l
并用脚本中的正确名称替换它。
请对大写字母充满信心(“雷鸟”而非“雷鸟”)!
在3d工作区(-t 2
)上使用Firefox的其他示例:
#!/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。但应该为所有人工作