Як я можу змінити поведінку гарячих клавіш у 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. Як я можу це зробити?


Невже подібне перетинання (тут і на stackoverflow) справді звичайна справа?
ДМИТРІЙ МАЛИКОВ

Ні: це активно відлякує ...
jasonwryan

Це поза темою на SO, тому я попросив їх позбутися своєї копії
Michael Mrozek

@ 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", воно буде зосереджене і встановлене на головне , тобто, залежно від вашої недавньої верстки , буде великим вікном
  • якщо жодне вікно не збігається, Firefox буде породжений та встановлений у майстер .

Максимізацію можна імітувати, вибираючи Fullмакет після виклику runOrRaiseMaster, як описано тут :

("M-<F1>", sendMessage $ JumpToLayout "Full")

(зауважте, що цей приклад також демонструє, XMonad.Util.EZConfigщо дозволяють простіші визначення ключових зв'язків)

Поєднувати ці дві речі теж можливо. Обидва є типом X (), тобто вони знаходяться в X Монаді . Використання >>, що типу (перевірте :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 для великого добра? )


Дякуємо за відповідь та іншу інформацію та навчальний посібник 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 (раніше run...)
sr_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.