如何动态更改xmobar配置

时间:2013-10-10 00:51:28

标签: configuration xmonad xmobar

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

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

和&lt; - 的编译器barfs。您可以在代码中阅读我的意图。我不是Haskell的专家,而且我正在通过lego方法慢慢地建立我想要的环境,但这在我这里失败了。

我哪里错了?

TIA

1 个答案:

答案 0 :(得分:3)

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

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

  

{ - #LANGUAGE DeriveDataTypeable# - }

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

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

instance ExtensionClass XMobarHandle where
        initialValue = XMobarHandle Nothing

现在您可以定义键绑定,它从可扩展状态检索当前xmobar句柄,如果它不是 Nothing 则关闭它,生成一个新的并将其置于状态。< / p>

((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