configuration - 如何动态更改 xmobar 配置

标签 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")

和编译器在 <-.您可能可以在代码中阅读我的意图。我不是 Haskell 专家,我正在通过使用乐高方法慢慢建立我想要的环境,但这让我在这里失败了。

我哪里错了?

TIA

最佳答案

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

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

{-# LANGUAGE DeriveDataTypeable #-}



您需要它来为存储 xmobar 句柄的数据类型派生 Typeable 实例。
newtype XMobarHandle = XMobarHandle { xmhandle :: Maybe Handle } deriving Typeable

instance ExtensionClass XMobarHandle where
        initialValue = XMobarHandle Nothing

现在您可以定义键绑定(bind),它从可扩展状态检索当前 xmobar 句柄,如果它不是 Nothing,则将其关闭,生成一个新句柄并将其放入状态。
((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)
)

如果您愿意,可以为绑定(bind)中的 do block 创建一个函数。另一个键的绑定(bind)留作练习!

要使其编译,您仍然需要此代码中使用的模块的导入语句。 (不过,我可能忘记了一个!)
import           XMonad.Util.Run
import           System.IO
import qualified XMonad.Util.ExtensibleState         as XS

您还必须编辑您的 logHook。在那里,您必须像在键绑定(bind)中一样从可扩展状态中提取句柄,并将其作为参数提供给函数 xmobarlog。

关于configuration - 如何动态更改 xmobar 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19285278/

相关文章:

c++ - OpenCV 和 Visual Studio 配置

azure - 在 Azure 服务之间共享配置

haskell - 如何将托盘设置在 xmonad 中的所有工作区上?

haskell - XMonad 中只有内部间距

haskell - Xmonad 切换全屏/xmobar

linux - XMobar 隐藏在第一个 XMonad 工作区

c++ - C++ 中的 visual studio 解决方案配置值

c# - 如何以编程方式修改 app.config 中的 assemblyBinding?

linux - XMonad 不会使用 mod4Mask 产生任何东西