如果还没有启动,在特定工作区启动应用程序
总之:当我切换到工作区X时,我想让一些程序自动启动,但前提是它们尚未启动。如果还没有启动,在特定工作区启动应用程序
这与XMonad startup on different workspaces不同,因为我不想将窗口移动到特定的工作空间(例如始终将xterm移动到工作空间2)。
这对我不起作用:xmonad spawn on startup in different workspace。我不希望所有应用程序在我登录时立即启动,也不会自动启动,例如xterm如果我关闭它并再次切换到工作区2。
别再想什么行不通,这里是做工作:
(几乎)
在我区列表我认为与工作区名称touples和列表中的程序来
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
S中的窗口的当前工作空间和返回command
是否已经存在。
我发现它非常困难(与其他语言和技术相比)来搜索XMonad的方式来做事情。对于这种情况,我只能找到如何获取当前WS - https://superuser.com/a/852152/481701中的窗口。好吧,我想,这给了我一个Window对象,我可以查询它的一些属性。
但是没有。该窗口实际上是Word64
的别名!好吧,我想。谷歌xmonad获取窗口属性。没有。 xmonad从窗口ID获取类名。没有。 xmonad窗口信息。还有其他十几种说法类似的方法 - 没有有用的结果。我所获得的只是xmonad主页,FAQ或“Xmonad配置提示”。
我试过这些在hayoo!,而且我能得到的距离最近的是“fromClassName - 根据它的className着色一个窗口”。哈哈。
那么,我怎样才能得到一个窗口的className(或任何其他属性)以外的ManageHook?
您可能会喜欢dynamic projects或topic spaces作为预焙替代品。他们并没有刚好你的建议,但也许其中一个足够接近,仍然是有用的,并且需要较少的配置工作。
我想映射spawn在filtered_commands中的字符串,任何想法,为什么这不起作用?
是的,你需要解除mapM_
来处理一元参数(而不是一元函数或返回值)。因此:
filtered_commands >>= mapM_ spawn
或者,因为你已经在do
块:
result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands
所以,我怎么能得到的
ManageHook
外窗的className
(或任何其他属性)?
className = ask >>= (\w -> liftX $ withDisplay $ \d -> fmap resClass $ io $ getClassHint d w)
你可以取适量参数liftX
为X
行动,而不是一个Query
行动。关键功能是来自X11软件包的getClassHint
,该软件还提供对Windows其他属性的访问。
非常感谢您对如此详细的答案的每一部分! –