Как я могу изменить поведение горячих клавиш в xmonad, если программа запущена?

12

Я использую несколько сопоставлений клавиш в моем xmonad.hsфайле конфигурации:

...
    , modMask = mod4Mask     -- Rebind Mod to the Windows key
...
 [ ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s")
 , ((0, xK_Print), spawn "scrot")
 , ((controlMask, xK_f), spawn "firefox")
 ]

Третье отображение выполняется firefoxпри нажатии ctrl+f. Я хотел бы сделать что-то более сложное:

if (firefox is running):
  focus and maximize firefox window:
else:
  run firefox

И я хотел бы изменить ctrl+fна win+f. Как я могу это сделать?

xralf
источник
Кросспостинг, подобный этому (здесь и на stackoverflow), действительно обычный бизнес?
ДМИТРИЙ МАЛИКОВ
Нет: это активно не рекомендуется ...
Джейсонвриан
Это не по теме на SO, поэтому я попросил их избавиться от своей копии
Майкл Мрозек
@ dmitry.malikov Кажется, это лучшее место для вопроса.
xralf
Даже лучше; xralf удалил копию SO. Большое спасибо
Майкл Мрозек

Ответы:

8

Глядя на 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 для хорошего блага? )

Sr-
источник
Спасибо за рабочий ответ и другую информацию, а также учебник по Haskell. Мне нравится синтаксис Haskell и функциональная парадигма. Единственное, что не работает, это часть >> (sendMessage $ JumptoLayout "Full")ошибки конструктора. Может быть, это что-то простое, что я решу после изучения Haskell.
xralf
Я забыл: все modmже не работает, я все еще использую controlMask.
xralf
@xralf, (1) отсутствовала скобка - теперь она работает? (2) Мне понадобится все ваше, xmonad.hsчтобы это исправить; Лучше просто загляните сюда, в архив конфигурации и посмотрите, как это делают другие или используют упомянутое EZConfig.
sr_
Кронштейн не помог. Вот файл xmonad.hs, который я использую.
xralf
(1) Скобки по-прежнему неверны, действие X ()связывания типа с ключом должно быть таким (runOrRaiseMaster ...) >> (sendMessage ...), что приводит к ,((...,...), (runOrR...) >> (send...) ) (a (before run...)
sr_