Bagaimana saya bisa mengubah perilaku hotkey di xmonad jika program sedang berjalan?


12

Saya menggunakan beberapa pemetaan kunci dalam xmonad.hsfile konfigurasi saya :

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

Pemetaan ketiga berjalan firefoxsaat menekan ctrl+f. Saya ingin melakukan sesuatu yang lebih kompleks:

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

Dan saya ingin mengubah ctrl+fke win+f. Bagaimana saya bisa melakukan itu?


Apakah crossposting seperti ini (di sini dan di stackoverflow) benar-benar bisnis biasa?
ДМИТРИЙ МАЛИКОВ

Tidak: ini tidak dianjurkan ...
jasonwryan

Ini di luar topik pada SO, jadi saya meminta mereka untuk menyingkirkan salinan mereka
Michael Mrozek

@ dmitry.malikov Ini sepertinya tempat yang lebih baik untuk pertanyaan itu.
xralf

Bahkan lebih baik; xralf menghapus salinan SO. Terima kasih banyak
Michael Mrozek

Jawaban:


8

Melihat paket contrib XMonad , Anda akan menemukan XMonad.Actions.WindowGo, yang mengekspor fungsi berikut :

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

yang membutuhkan argumen string dari program untuk dijalankan , misalnya "firefox"; dan permintaan boolean yang digunakan untuk mencari tahu apakah sudah berjalan , melalui properti X11, misalnya (className =? "Firefox")(lihat bagian atas XMonad.Actions.WindowGohalaman untuk varian).

Jadi, yang Anda butuhkan hanyalah mengikat runOrRaiseMaster "firefox" (className =? "Firefox")ke kunci yang Anda inginkan, seperti yang dijelaskan dalamXMonad.Doc.Extending , via

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

sebagai bagian dari ikatan utama Data.Mapdari konfigurasi Anda (detail berbeda dengan cara Anda mengaturnya, yaitu keseluruhan Anda xmonad.hs, lihat Menambah Gantungan Kunci ).

Perhatikan bahwa tidak ada arti nyata dalam memaksimalkan jendela di XMonad. Ketika Anda mengatur semuanya seperti yang dijelaskan, Anda akan Mod4+ fbertindak sebagai berikut:

  • jika ada jendela dengan pencocokan nama kelas "Firefox", itu akan difokuskan dan ditetapkan untuk dikuasai , yaitu, tergantung pada tata letak Anda saat ini , akan menjadi jendela besar
  • jika tidak ada pertandingan jendela, Firefox akan melahirkan dan diatur untuk menguasai .

Memaksimalkan dapat ditiru dengan memilih Fulltata letak setelah menelepon runOrRaiseMaster, seperti yang dijelaskan di sini :

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

(perhatikan bahwa contoh ini juga menunjukkan XMonad.Util.EZConfigmemungkinkan definisi pengikat kunci yang lebih mudah)

Menggabungkan dua hal ini juga dimungkinkan. Keduanya bertipe X (), yaitu, mereka berada di X Monad . Menggunakan >>, yang merupakan tipe (cek dengan :t (>>)di ghci)

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

kami memiliki (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")kombinasi dua X ()jenis tipe X ()juga, dan dengan demikian dapat diikat ke kunci.

EDIT Hilang )pada baris kode dengan>>

Edit2 modm -> modMask.

Sunting3 Semoga ini xmonad.hsberhasil.

( Kenapa tidak belajar kamu Haskell untuk selamanya? )


Terima kasih atas jawaban yang bekerja dan informasi lainnya serta tutorial Haskell. Saya suka sintaks dan paradigma fungsional Haskell. Satu-satunya hal yang tidak berfungsi adalah bagian >> (sendMessage $ JumptoLayout "Full")ada beberapa kesalahan dengan konstruktor. Mungkin itu sesuatu yang mudah, yang akan saya pecahkan setelah mempelajari Haskell.
xralf

Saya lupa: Namun modmtidak berhasil, saya masih menggunakan controlMask.
xralf

@xralf, (1) ada braket yang hilang - apakah itu berfungsi sekarang? (2) Saya perlu seluruh Anda xmonad.hsuntuk memperbaikinya; lebih baik hanya melihat-lihat di sini, arsip konfigurasi dan melihat bagaimana orang lain melakukannya atau menggunakan yang disebutkan EZConfig.
sr_

Braket tidak membantu. Ini file xmonad.hs yang saya gunakan.
xralf

(1) Kurung masih salah, aksi ketik X ()untuk mengikat kunci seharusnya (runOrRaiseMaster ...) >> (sendMessage ...), menghasilkan ,((...,...), (runOrR...) >> (send...) ) ( (sebelum run...)
sr_
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.