嗯,這是相當複雜的,做你想做的。您可以使用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。
謝謝你不厭其煩地回答如此全面。雖然細節超出了樂高Haskell編碼器,但原理很清晰,您的解釋使得程序變得簡單。 –