Jak mogę zmienić zachowanie klawiszy skrótu w Xmonad, jeśli program jest uruchomiony?

12

Korzystam z kilku kluczowych mapowań w moim xmonad.hspliku konfiguracyjnym:

...
    , 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")
 ]

Trzecie mapowanie uruchamia się firefoxpo naciśnięciu ctrl+f. Chciałbym zrobić coś bardziej złożonego:

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

I chciałbym się zmienić ctrl+fna win+f. Jak mogę to zrobić?

xralf
źródło
Czy takie crossspostowanie (tutaj i na stackoverflow) to naprawdę zwykła sprawa?
ДМИТРИЙ МАЛИКОВ 11.11.11
No: jest ona aktywnie zniechęca ...
jasonwryan
To nie jest temat na SO, więc poprosiłem ich, aby pozbyli się ich kopii
Michael Mrozek
@ dmitry.malikov To wydaje się lepsze miejsce na pytanie.
xralf
Nawet lepiej; xralf usunął kopię SO. Wielkie dzięki
Michael Mrozek

Odpowiedzi:

8

Patrząc na pakiety contrib XMonada , znajdziesz XMonad.Actions.WindowGo, który eksportuje następującą funkcję :

runOrRaiseMaster :: String -> Query Bool -> X ()

który pobiera argument ciągu programu do uruchomienia , np. „firefox”; oraz zapytanie boolowskie, które służy do sprawdzenia, czy jest już uruchomione , za pośrednictwem właściwości X11, np. (className =? "Firefox")(patrz warianty na górze XMonad.Actions.WindowGostrony ).

Wszystko, czego potrzebujesz, to powiązanie runOrRaiseMaster "firefox" (className =? "Firefox")z kluczem, który chcesz, jak wyjaśniono wXMonad.Doc.Extending , za pośrednictwem

((modMask, xK_f ), runOrRaiseMaster "firefox" (className =? "Firefox"))

jako część powiązań klawiszy Data.Mapw konfiguracji (szczegóły różnią się w zależności od sposobu konfiguracji, tj. całość xmonad.hs, patrz Dodawanie skrótów klawiszowych ).

Zauważ, że nie ma sensu maksymalizować okna w XMonad. Po skonfigurowaniu rzeczy zgodnie z objaśnieniem będziesz Mod4+ fdziałał w następujący sposób:

  • jeśli jest okno z nazwą klasy pasującą do „Firefox”, zostanie ono skoncentrowane i ustawione jako master , tj., w zależności od twojego ostatniego układu , będzie dużym oknem
  • jeśli okno nie pasuje, Firefox zostanie odrodzony i ustawiony na master .

Maksymalizację można emulować, wybierając Fullukład po wywołaniu runOrRaiseMaster, jak opisano tutaj :

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

(zwróć uwagę, że w tym przykładzie pokazano również XMonad.Util.EZConfigłatwiejsze definicje skrótów klawiszowych)

Możliwe jest także połączenie tych dwóch rzeczy. Oba są typu X (), tj. Są w X Monadzie . Korzystanie >>, który jest typu (sprawdź :t (>>)w ghci)

(>>) :: Monad m => m a -> m b -> m b

mamy (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")też kombinację dwóch X ()typów typów X (), dzięki czemu można go przypisać do klucza.

EDYCJA Brakuje )w wierszu kodu za pomocą>>

Edycja2 modm -> modMask.

Edit3 To xmonad.hsmiejmy nadzieję działa.

( Dlaczego nie nauczyć się Haskella dla wielkiego dobra? )

sr_
źródło
Dziękujemy za roboczą odpowiedź i inne informacje oraz samouczek Haskell. Lubię składnię Haskell i paradygmat funkcjonalny. Jedyne, co nie działa, to część >> (sendMessage $ JumptoLayout "Full")błędu w konstruktorze. Może to coś łatwego, co rozwiążę po nauce Haskella.
xralf
Zapomniałem: Ale modmto nie działa, wciąż używam controlMask.
xralf
@xralf, (1) brakowało nawiasu - czy to działa teraz? (2) Potrzebuję twojej całości, xmonad.hsaby to naprawić; lepiej po prostu zajrzyj tutaj, archiwum konfiguracji i zobacz, jak inni to robią lub używają wspomnianego EZConfig.
sr_
Wspornik nie pomógł. Oto plik xmonad.hs, którego używam.
xralf
(1) Nawiasy klamrowe są nadal niepoprawne, działanie typu „ X ()bind” na klawiszu powinno być (runOrRaiseMaster ...) >> (sendMessage ...), w wyniku czego ,((...,...), (runOrR...) >> (send...) ) (a (wcześniej run...)
sr_ 24.11.11