简而言之:当我切换到工作区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]。我想映射 在 filtered_commands 中的字符串上生成
,知道为什么这不起作用吗?)
最后缺少的部分是 isNotOpen
函数,该函数应搜索当前工作区中窗口的 className
并返回是否 command
已经在那里了。
我发现(与其他语言和技术相比)寻找 XMonad 的做事方式非常困难。对于这种情况,我只能找到如何获取当前 WS 中的窗口 - https://superuser.com/a/852152/481701 。好吧,我想,这给了我一个 Window 对象,我可以查询它的一些属性。
但是没有。 Window 实际上是...Word64
的别名!!!好吧,我想。 Google xmonad 获取窗口属性。没有什么。 xmonad 从窗口 ID 获取类名。没有什么。 xmonad 窗口信息。还有十几种其他方式来表达类似的内容 - 没有任何有用的结果。我得到的只是 xmonad 主页、常见问题解答或“Xmonad 配置提示”。
我也在 hayoo! 中尝试过这些,我能得到的最接近的是“fromClassName - 根据窗口的类名对窗口进行着色。”。哈哈。
那么,如何在 ManageHook 之外获取窗口的 className(或任何其他属性)?
最佳答案
您可能喜欢dynamic projects或topic spaces作为预烘焙的替代品。它们并不完全按照您的建议进行,但也许其中一个足够接近,仍然有用,并且需要较少的配置工作。
I want to map spawn over the strings in filtered_commands, any idea why this doesn't work?
是的,您需要提升mapM_
来处理一元参数(而不是一元函数或返回值)。因此:
filtered_commands >>= mapM_ spawn
或者,因为您已经处于 do
block 中:
result_of_filtered_commands <- filtered_commands
mapM_ spawn result_of_filtered_commands
So, how can I get a window's
className
(or any other attributes) outside ofManageHook
?
className = ask >>= (\w -> liftX $ withDisplay $ \d -> fmap resClass $ io $ getClassHint d w)
您可以仅将 liftX
的参数作为 X
操作而不是 Query
操作。关键函数是getClassHint
来自 X11 包。该包还提供对窗口其他属性的访问。
关于haskell - 如果尚未在特定工作区启动应用程序,则在该工作区启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45908110/