Program çalışıyorsa xmonad kısayol tuşlarının davranışını nasıl değiştirebilirim?


12

xmonad.hsYapılandırma dosyamda birkaç anahtar eşleme kullanıyorum :

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

Üçüncü eşleme firefoxbasıldığında çalışır ctrl+f. Daha karmaşık bir şey yapmak istiyorum:

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

Ve değiştirmek istiyorum ctrl+fiçin win+f. Bunu nasıl yapabilirim?


Crossposting böyle (burada ve stackoverflow üzerinde) gerçekten olağan bir iş midir?
ДМИТРИЙ МАЛИКОВ

Hayır: aktif olarak cesaretini kırdı ...
jasonwryan

SO konu dışı, bu yüzden onlardan kopyalarından kurtulmalarını istedim
Michael Mrozek

@ dmitry.malikov Burası soru için daha iyi bir yer gibi görünüyor.
xralf

Daha iyi; xralf SO kopyasını sildi. Çok teşekkürler
Michael Mrozek

Yanıtlar:


8

Baktığımızda xmonad en contrib paketleri , bulacağınız XMonad.Actions.WindowGoihraç eden, aşağıdaki işlevi :

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

çalıştırılacak programın dize argümanını alır , örneğin "firefox"; ve X11 özellikleri aracılığıyla zaten çalışıp çalışmadığını bulmak için kullanılan bir boole sorgusu , ör. (className =? "Firefox")( varyantlar için XMonad.Actions.WindowGosayfanın üst kısmına bakın ).

Yani, ihtiyacınız olan tek runOrRaiseMaster "firefox" (className =? "Firefox")şey, açıklandığı gibiXMonad.Doc.Extending , istediğiniz anahtara bağlamaktır .

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

Data.Mapyapılandırmanızın temel bağlarının bir parçası olarak (ayrıntılar, ayar yönteminize göre farklılık gösterir, yani tüm bunlarxmonad.hs , bkz . Anahtar Bağlama Ekleme ).

Not hiçbir gerçek anlamda olmadığı bir pencere maksimize xmonad içinde. İşleri açıklandığı gibi ayarladığınızda, aşağıdaki gibi Mod4+ fharekete geçersiniz:

  • Bir sınıfadı eşleştirmesi "Firefox" ile bir pencere varsa, o odaklanmış olacak ve usta olarak ayarlanmış , yani en son bağlı düzen olacak büyük pencere
  • Hiçbir pencere eşleşirse, Firefox edilecektir kökenli ve usta olarak ayarlanmış .

Seçerek taklit edilebilir maksimize Fullçağrı sonrası düzeni runOrRaiseMaster, burada anlatıldığı gibi :

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

(bu örnekte XMonad.Util.EZConfigdaha kolay tuş bağlama tanımlarına izin verildiğini de unutmayın )

Bu iki şeyi birleştirmek de mümkündür. Her ikisi de tiptedir X (), yani X Monad'ındadır . >>Türü olan kullanma ( :t (>>)giriş yapma ghci)

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

(runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")iki X ()tür türün bir kombinasyonu olarak da var X ()ve bu nedenle bir anahtara bağlanabilir.

EDIT )ile kod satırında eksik>>

Düzenle2 modm -> modMask.

Edit3 Bu xmonad.hsumarım çalışır.

( Neden sana iyi bir Haskell öğrenmiyorsun? )


Çalışma yanıtı ve diğer bilgiler ve Haskell öğretici için teşekkür ederiz. Haskell sözdizimini ve fonksiyonel paradigmayı seviyorum. Çalışmayan tek şey, >> (sendMessage $ JumptoLayout "Full")yapıcıda bazı hataların olduğu kısımdır . Belki kolay bir şeydir, Haskell'i öğrendikten sonra çözeceğim.
xralf

Unuttum: Yine de modmişe yaramıyor, hala kullanıyorum controlMask.
xralf

@xralf, (1) eksik bir parantez vardı - şimdi çalışıyor mu? (2) Bunu xmonad.hsdüzeltmek için bütününüze ihtiyacım var ; daha iyi bir şekilde buraya, yapılandırma arşivine bir göz atın ve başkalarının bunu nasıl yaptığını veya belirtilenleri kullandığını görün EZConfig.
sr_

Köşebent yardımcı olmadı. İşte kullandığım xmonad.hs dosyası.
xralf

(1) Köşeli ayraçlar hala yanlış, X ()anahtara bağlanmak için tür eylemi (runOrRaiseMaster ...) >> (sendMessage ...), sonuç ,((...,...), (runOrR...) >> (send...) ) ( (önce run...) ile sonuçlanmalıdır
sr_
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.