我想使用组合键即时在xmobar配置之间切换。我已经将以下内容天真地标记到了其他关键模块上:

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


而编译器barfs位于
我要去哪里错了?

TIA

最佳答案

好吧,做您想做的事情很复杂。您可以使用the xmonad-contrib library中的可扩展状态模块。

为此,您必须在xmonad配置文件的顶部添加LANGUAGE pragma


{-#语言DeriveDataTypeable#-}


您需要它来派生用于存储xmobar句柄的数据类型的Typeable实例。

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

instance ExtensionClass XMobarHandle where
        initialValue = XMobarHandle Nothing


现在,您可以定义键绑定,该键绑定从可扩展状态检索当前的xmobar句柄,如果不是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)
)


如果愿意,可以为绑定中的do块创建一个函数。其他键的绑定留作练习!

要进行编译,您仍然需要此代码中使用的模块的import语句。 (不过,我可能已经忘记了!)

import           XMonad.Util.Run
import           System.IO
import qualified XMonad.Util.ExtensibleState         as XS


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

08-08 06:19