Как использовать Dzen вместо Xmobar в этой необычной настройке

Я новичок в Haskell, и в настоящее время у меня нет времени действительно изучать Haskell, поэтому я прошу помощи у экспертов, которые уже разобрались с этим. :)

Это мой текущий файл xmonad.hs: https://github.com/Greduan/dotfiles/blob/dd45d287fade73a3191ad313ec37231a8c802942/xmonad/xmonad.hs

Как я могу добавить / настроить привязки клавиш (см. Переменную myKeys) и как я могу перейти с Xmobar на базовую (пока нет конфигурации) настройку Dzen.

Эта настройка, похоже, не используется ни в одной из найденных мной конфигураций, и каждый раз, когда я пытаюсь преобразовать ее в другой формат, она работает не очень хорошо.

Другой формат - main = do etc. etc. etc. BTW.

А также, как я могу просто преобразовать из этого формата в более широко используемый.


person greduan    schedule 19.01.2014    source источник


Ответы (2)


О "преобразовании":

Поскольку xmonad.hs - это просто исходный код haskell, который скомпилирован в «ваш» xmonad, на самом деле нет «формата», и есть много способов написать то же самое.

Если вы имеете в виду, как преобразовать main из использования = ‹( оператор для нотации do:

main = xmonad =<< statusBar myBar myPP statusbarToggleKey myConfig

Здесь вы используете две функции:

  • функция statusBar, которая принимает четыре аргумента и возвращает IO (XConfig (ModifiedLayout AvoidStruts l). Итак, в основном, используя то, что вы ему передали, statusBar создает соответствующий XConfig и возвращает его завернутым в монаду ввода-вывода.

  • функция xmonad принимает XConfig и возвращает IO ()

= ‹* объединяет два: берет XConfig, возвращенный statusBar, из монады ввода-вывода и передает его xmonad.

Эквивалент в записи do:

main = do 
    config <- statusBar myBar myPP statusbarToggleKey myConfig
    xmonad config

Но как только вы поймете, что делают операторы монад, они могут выглядеть более элегантно, чем нотации.

Использование dzen:

Если вы хотите продолжать использовать функцию statusBar, вам просто нужно изменить аргументы, которые вы ей передаете.

-- the command line to launch the status bar
myBar = "dzen2 -y -1" --that's for dzen at the bottom of the screen
-- the PP
myPP = defaultPP

Привязки клавиш:

Вы можете увидеть тип keys в определении XConfig. Это функция, которая принимает XConfig и возвращает карту.

Вот пример "красивого" способа его написания с использованием функции fromList из Data.Map:

import qualified Data.Map as M

myKeys conf@(XConfig {modMask = modm}) = M.fromList $
    [
     ((modm, xK_c), kill),
     ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
    ]

А затем, если вы хотите использовать ключи, определенные в defaultConfig в дополнение к вашему, вы можете использовать <+>:

myConfig = defaultConfig
    { 
     ...
    , keys = myKeys <+> keys defaultConfig 
    }
person Leiaz    schedule 29.01.2014
comment
О, я не добавил ключи по умолчанию к своим пользовательским клавишам, да. У меня тоже работает нормально. - person somesoaccount; 30.01.2014

Что касается привязки клавиш, используйте additionalKeys (из модуля XMonad.Util .EZConfig). Вот некоторые привязки клавиш, которые я использую (возможно, вам понадобится еще импорт, чтобы все работало):

defaultConfig
{
-- stuff
} `additionalKeys`
[ ((0, xK_Print), spawn "scrot")
, ((mod1Mask, xK_Print), spawn "scrot -m -d 1")
, ((mod1Mask .|. shiftMask, xK_t), spawn "killall trayer && trayer --edge top --align right --SetDockType true --SetPartialStrut true  --expand true --transparent true --width 5 --alpha 255 --tint 0x191970 --height 17")
, ((mod1Mask, xK_p), spawn "dmenu_run")
, ((mod1Mask, xK_b   ), sendMessage ToggleStruts)
, ((mod1Mask, xK_m   ), focusUrgent)
, ((mod1Mask, xK_n   ), D.dzen "Hi, mom!" (seconds 4))
, ((mod1Mask, xK_f   ), goToSelected defaultGSConfig)
, ((mod4Mask, xK_l   ), spawn "cmus-remote -n ") --next song
, ((mod4Mask, xK_h   ), spawn "cmus-remote -r") --previous song
, ((mod4Mask, xK_s   ), spawn "cmus-remote -s") --stop
, ((mod4Mask, xK_p   ), spawn "cmus-remote -p") --play
, ((mod4Mask, xK_Right   ), spawn "cmus-remote -k +5") --forward 5 sec
, ((mod4Mask, xK_Left    ), spawn "cmus-remote -k -5") --rewind 5 sec
, ((mod4Mask, xK_KP_Subtract    ), spawn "amixer -q sset PCM 2dB-") --quieter
, ((mod4Mask, xK_KP_Add         ), spawn "amixer -q sset PCM 2dB+") --louder
, ((mod1Mask .|. shiftMask, xK_udiaeresis), removeWorkspace)
, ((mod1Mask .|. shiftMask, xK_numbersign), selectWorkspace defaultXPConfig)
]

D.dzen происходит от import qualified XMonad.Util.Dzen as D. Я не использую dzen в качестве строки состояния, но, возможно, изучение этого модуля может дать вам некоторые подсказки.

изменить: вот конфигурация dzen: And1's_xmonad.hs . Взято с этого сайта с множеством примеров: Config_archive.

edit2: Я просто немного поигрался с новой функцией statusBar, которая, по-видимому, довольно новая, и придумал рабочий пример.

edit3: удалил logHook, поскольку он не нужен с statusBar. main теперь выглядит так:

main = do
    xmonad =<< statusBar "dzen2" myPP toggleStrutsKey
    defaultConfig { --stuff
    }

Настройка keys у меня не сработала, и мне пришлось придерживаться additionalKeys (не забудьте тогда фигурные скобки):

main = do
    xmonad =<< statusBar "dzen2" myPP toggleStrutsKey
    (defaultConfig { --stuff
    } `additionalKeys`
    [ -- key bindings
    ])

После того, как я привел в порядок свой xmonad.hs, я также могу предоставить весь файл ..

person somesoaccount    schedule 29.01.2014
comment
Отличный ответ, спасибо! Возможно, буду использовать его в будущем. :) - person greduan; 30.01.2014