2013-10-10 34 views
4

我想通過使用組合鍵快速切換xmobar配置。我曾天真地標記以下到我的其他重要器官功能障礙綜合徵:在<如何即時更改xmobar配置

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

和編譯器barfs - 。您大概可以在代碼中閱讀我的意圖。我不是Haskell專家,我正在通過使用lego方法慢慢地建立我想要的環境,但是這在我這裏已經失敗了。

我哪裏錯了?

TIA

回答

2

嗯,這是相當複雜的,做你想做的。您可以使用the xmonad-contrib library的可擴展狀態模塊。

對於這一點,你必須在你的xmonad配置文件的頂部添加LANGUAGE pragma

{ - #語言DeriveDataTypeable# - }

你需要它來推導分型實例,用於存儲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) 
) 

如果您願意,您可以在綁定中爲do塊創建一個函數。其他鍵的綁定留作練習!

要編譯它,您仍需要此代碼中使用的模塊的導入語句。 (雖然我可能已經忘了一個!)

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

你也必須編輯你的logHook。您必須像在keybind中那樣從可擴展狀態中提取句柄,並將其作爲函數的參數xmobarlog

+0

謝謝你不厭其煩地回答如此全面。雖然細節超出了樂高Haskell編碼器,但原理很清晰,您的解釋使得程序變得簡單。 –