Как изменить конфигурацию 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, но это меня не подвело.
Куда я иду не так?
ТИА
1 ответ
Ну, довольно сложно делать то, что ты хочешь. Вы можете использовать модуль расширяемого состояния из библиотеки xmonad-contrib.
Для этого вы должны добавить прагму LANGUAGE вверху вашего файла конфигурации xmonad:
{- # ЯЗЫК DeriveDataTypeable #-}
Он необходим для получения экземпляра Typeable для типа данных, в котором хранится дескриптор xmobar.
newtype XMobarHandle = XMobarHandle { xmhandle :: Maybe Handle } deriving Typeable
instance ExtensionClass XMobarHandle where
initialValue = XMobarHandle Nothing
Теперь вы можете определить привязку ключа, которая извлекает текущий дескриптор 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)
)
Вы можете создать функцию для блока do в привязке, если хотите. Привязка к другому ключу оставлена в качестве упражнения!
Для его компиляции вам все еще нужны операторы импорта для модулей, используемых в этом коде. (Возможно, я забыл один, хотя!)
import XMonad.Util.Run
import System.IO
import qualified XMonad.Util.ExtensibleState as XS
Вы также должны отредактировать свой logHook. Там вы должны извлечь дескриптор из расширяемого состояния, как в связке ключей, и передать его в качестве параметра функции xmobarlog.