Làm cách nào để thay đổi hành vi của các phím nóng trong xmonad nếu chương trình đang chạy?


12

Tôi đang sử dụng một vài ánh xạ chính trong xmonad.hstệp cấu hình của mình :

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

Ánh xạ thứ ba chạy firefoxkhi nhấn ctrl+f. Tôi muốn làm một cái gì đó phức tạp hơn:

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

Và tôi muốn đổi ctrl+fthành win+f. Làm thế nào tôi có thể làm điều đó?


Là crossposting như thế này (ở đây và trên stackoverflow) thực sự là một doanh nghiệp thông thường?
ДМИТРИЙ МАЛИКОВ

Không: nó được khuyến khích tích cực ...
jasonwryan

Không có chủ đề trên SO, vì vậy tôi đã yêu cầu họ loại bỏ bản sao của mình
Michael Mrozek

@ dmitry.malikov Đây có vẻ là nơi tốt hơn cho câu hỏi.
xralf

Thậm chí còn tốt hơn; xralf đã xóa bản sao SO. Rất cám ơn
Michael Mrozek

Câu trả lời:


8

Nhìn vào các gói đóng góp của XMonad , bạn sẽ thấy XMonad.Actions.WindowGo, xuất khẩu chức năng sau :

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

trong đó có một đối số chuỗi của chương trình để chạy , ví dụ "firefox"; và một truy vấn boolean được sử dụng để tìm hiểu xem nó có đang chạy hay không , thông qua các thuộc tính X11, ví dụ (className =? "Firefox")(xem đầu XMonad.Actions.WindowGotrang để biết các biến thể).

Vì vậy, tất cả những gì bạn cần là liên kết runOrRaiseMaster "firefox" (className =? "Firefox")với khóa bạn muốn, như được giải thích trongXMonad.Doc.Extending , thông qua

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

như một phần của các ràng buộc chính Data.Maptrong cấu hình của bạn (chi tiết khác với cách cài đặt của bạn, nghĩa là toàn bộ phần của bạn xmonad.hs, xem Thêm Keybindings ).

Lưu ý rằng không có ý nghĩa thực sự trong việc tối đa hóa một cửa sổ trong XMonad. Khi bạn thiết lập mọi thứ như được giải thích, bạn sẽ có Mod4+ fhành động như sau:

  • nếu có một cửa sổ có tên lớp khớp với "Firefox", nó sẽ được tập trungđược đặt thành chủ , tức là tùy thuộc vào bố cục gần đây của bạn , sẽ là cửa sổ lớn
  • nếu không có cửa sổ nào khớp, Firefox sẽ được sinh rađược đặt thành chủ .

Tối đa hóa có thể được mô phỏng bằng cách chọn Fullbố cục sau khi gọi runOrRaiseMaster, như được mô tả ở đây :

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

(lưu ý rằng ví dụ này cũng cho thấy XMonad.Util.EZConfigviệc cho phép định nghĩa khóa phím dễ dàng hơn)

Kết hợp hai điều này là có thể, quá. Cả hai đều thuộc loại X (), tức là chúng ở trong X Monad . Sử dụng >>, đó là các loại (kiểm tra với :t (>>)trong ghci)

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

chúng ta cũng có (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")sự kết hợp của hai X ()loại loại X ()và do đó nó có thể được liên kết với một khóa.

EDIT Thiếu )trong dòng mã với>>

Chỉnh sửa2 modm -> modMask.

Edit3 Điều này xmonad.hshy vọng hoạt động.

( Tại sao không học cho bạn một Haskell cho những điều tốt đẹp? )


Cảm ơn bạn đã trả lời làm việc và thông tin khác và hướng dẫn Haskell. Tôi thích cú pháp Haskell và mô hình chức năng. Điều duy nhất không hoạt động là phần >> (sendMessage $ JumptoLayout "Full")có một số lỗi với hàm tạo. Có lẽ đó là một điều dễ dàng, mà tôi sẽ giải quyết sau khi học Haskell.
xralf

Tôi quên mất: Tuy nhiên, modmnó không hoạt động, tôi vẫn đang sử dụng controlMask.
xralf

@xralf, (1) có một dấu ngoặc bị thiếu - bây giờ nó có hoạt động không? (2) Tôi cần toàn bộ bạn xmonad.hsđể sửa lỗi này; tốt hơn là chỉ cần nhìn xung quanh đây, kho lưu trữ cấu hình và xem cách người khác làm điều đó hoặc sử dụng đề cập EZConfig.
sr_

Giá đỡ không giúp được gì. Đây là tập tin xmonad.hs tôi đang sử dụng.
xralf

(1) Dấu ngoặc vẫn sai, hành động của loại X ()để liên kết với khóa sẽ là (runOrRaiseMaster ...) >> (sendMessage ...), dẫn đến ,((...,...), (runOrR...) >> (send...) ) (a (trước run...)
sr_
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.