Глядя на CONTRIB пакеты XMonad в , вы найдете XMonad.Actions.WindowGo, что экспортирует следующие функции :
runOrRaiseMaster :: String -> Query Bool -> X ()
который принимает строковый аргумент программы для запуска , например "firefox"; и логический запрос, который используется, чтобы выяснить, запущен ли он уже через свойства X11, например (className =? "Firefox")( варианты см. в верхней части XMonad.Actions.WindowGoстраницы ).
Итак, все, что вам нужно, это привязать runOrRaiseMaster "firefox" (className =? "Firefox")ключ, который вы хотите, как объяснено вXMonad.Doc.Extending , через
((modMask, xK_f ), runOrRaiseMaster "firefox" (className =? "Firefox"))
как часть привязок клавиш Data.Mapвашей конфигурации (подробности зависят от вашего способа настройки, т. е. от всего xmonad.hs, см. Добавление привязок клавиш ).
Обратите внимание, что нет никакого смысла максимизировать окно в XMonad. Когда вы настроите все как описано, вы будете иметь Mod4+ fдействовать следующим образом:
- если есть окно с именем класса, совпадающим с «Firefox», оно будет сфокусировано и установлено на master , т.е., в зависимости от вашего недавнего макета , будет большое окно
- если нет окна матчей, Firefox будет порождал и установлен в качестве ведущего .
Максимизации можно эмулировать, выбрав Fullраскладку после вызова runOrRaiseMaster, как описано здесь :
("M-<F1>", sendMessage $ JumpToLayout "Full")
(обратите внимание, что этот пример также демонстрирует XMonad.Util.EZConfigболее простые определения привязки клавиш)
Возможно объединение этих двух вещей. Оба имеют тип X (), т. Е. Находятся в X Monad . Использование >>, что типа (проверьте :t (>>)в ghci)
(>>) :: Monad m => m a -> m b -> m b
у нас (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")также есть комбинация двух X ()типов X (), и поэтому она может быть связана с ключом.
EDIT отсутствует )в строке кода с>>
Edit2 modm -> modMask.
Edit3 Это, xmonad.hsнадеюсь, работает.
( Почему бы не научить вас Haskell для хорошего блага? )