gpt4 book ai didi

haskell - 基于 REFLEXTX 切换收缩和扩展

转载 作者:行者123 更新时间:2023-12-04 15:25:46 25 4
gpt4 key购买 nike

我使用 XMonad.Layout.Reflect 和 XMonad.Layout.MultiToggle 在需要时左右翻转我的布局。但是,当任何布局被反射(reflect)时,我的键绑定(bind)用于缩小和扩展布局,例如。

...

((modm,  xK_h), sendMessage Shrink),
((modm, xK_l), sendMessage Expand),

...

它们的行为相反。

所以,我想要的是一种重新映射我的键的方法,或者可能使用一个函数而不是 sendMessage 以某种方式检测布局状态并根据它选择收缩/扩展。

现在我知道检查例如。全局状态变量(我猜没有这样的东西)不是很 Haskelly,所以我对如何做到这一点有点茫然。我考虑过 XMonad.Actions.PerWorkspaceKeys,但它似乎与整个工作区名称匹配。另一种方法可能是在 defaultConfig 中添加/删除键绑定(bind),但同样 - 我不确定这是否可行(无论如何它看起来很困惑)。

关于如何解决这个问题的任何想法?我从头到尾阅读了“Learn you a Haskell...”这本书并在此基础上制作小型程序,我了解 Haskell。

最佳答案

一种方法是使用布局描述来确定它是否已被反射(reflect),遵循 this blog post by Thomas Churchman :

import qualified XMonad.StackSet as S
import Data.List (isInfixOf)

getActiveLayoutDescription :: X String
getActiveLayoutDescription = do
workspaces <- gets windowset
return $ description . S.layout . S.workspace . S.current $ workspaces

键绑定(bind)将如下所示:
((modm,  xK_h), do
layoutDesc <- getActiveLayoutDescription
if "ReflectX" `isInfixOf` layoutDesc
then sendMessage Expand
else sendMessage Shrink
,
((modm, xK_l), do
layoutDesc <- getActiveLayoutDescription
if "ReflectX" `isInfixOf` layoutDesc
then sendMessage Shrink
else sendMessage Expand
),

边注:

my keybinds for shrinking and expanding the layout [...] behaves as they are inversed.



虽然您想要做的事情很有意义,但值得一提的是,这种行为的发生是因为反射(reflect)布局也将反射(reflect)主 Pane 的位置。自 ShrinkExpand在主 Pane 上操作,就绝对水平坐标而言,如果您使用类似 Tall 的布局,它们将看起来是倒置的。 ,其中主 Pane 位于屏幕左侧。不同的布局可能会受到不同的影响。

Now I know that checking eg. global state variables (of which there are no such thing I guess) is not very Haskelly, so I am at a little bit of a loss on how to do this.



这种做法并非不可想象,而且 XMonad.Util.ExtensibleState 是为了设置这种东西。不过,在这种情况下,我觉得使用有状态标志比它的值(value)要麻烦得多。

关于haskell - 基于 REFLEXTX 切换收缩和扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62285009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com