Configuration 如何动态更改xmobar配置

Configuration 如何动态更改xmobar配置,configuration,xmonad,xmobar,Configuration,Xmonad,Xmobar,我想通过使用组合键在xmobar配置之间动态切换。我天真地在我的其他关键MOD上标记了以下内容: , ((controlMask, xK_l), xmproc <- spawnPipe "/usr/bin/xmobar /home/tony/.xmobarLrc") , ((controlMask, xK_w), xmproc <- spawnPipe "/usr/bin/xmobar /home/tony/.xmobarWrc") ,((controlMask,xK_l),xmp

我想通过使用组合键在xmobar配置之间动态切换。我天真地在我的其他关键MOD上标记了以下内容:

, ((controlMask, xK_l), xmproc <- spawnPipe "/usr/bin/xmobar /home/tony/.xmobarLrc")
, ((controlMask, xK_w), xmproc <- spawnPipe "/usr/bin/xmobar /home/tony/.xmobarWrc")

,((controlMask,xK_l),xmproc嗯,做你想做的事情是相当复杂的。你可以从中使用可扩展的状态模块

为此,您必须在xmonad配置文件的顶部添加一个:

{-#语言派生数据类型化}

您需要它为存储xmobar句柄的数据类型派生可类型实例

newtype XMobarHandle = XMobarHandle { xmhandle :: Maybe Handle } deriving Typeable

instance ExtensionClass XMobarHandle where
        initialValue = XMobarHandle Nothing
现在您可以定义键绑定,它从可扩展状态检索当前xmobar句柄,如果它不是空的话关闭它,生成一个新句柄并将其置于状态

((controlMask, xK_l), do
    mh <- xmhandle `fmap` XS.get
    maybe (return ()) (io . hClose) mh
    xmproc <- spawnPipe "/usr/bin/xmobar /home/tony/.xmobarLrc"
    XS.put $ XMobarHandle (Just xmproc)
)

您还必须编辑日志钩子。在这里,您必须从可扩展状态中提取句柄,就像在keybind中一样,并将其作为函数xmobarlog的参数。

感谢您不厌其烦地给出如此全面的答案。虽然细节超出了lego Haskell编码器的范围,但原理很清楚,您的解释也很有帮助这个过程很简单。
import           XMonad.Util.Run
import           System.IO
import qualified XMonad.Util.ExtensibleState         as XS