ฉันจะเปลี่ยนพฤติกรรมของปุ่มลัดใน 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ฉันจะทำสิ่งนั้นได้อย่างไร


crossposting เป็นเช่นนี้ (ที่นี่และใน stackoverflow) เป็นธุรกิจปกติจริงหรือ
ДМИТРИЙМАЛИКОВ

ไม่: มันหมดกำลังใจอย่างแข็งขัน ...
jasonwryan

เป็นหัวข้อนอกเรื่องดังนั้นฉันจึงขอให้พวกเขากำจัดสำเนาของพวกเขา
Michael Mrozek

@ dmitry.malikov นี่น่าจะเป็นที่ที่ดีกว่าสำหรับคำถาม
xralf

ดียิ่งขึ้น xralf ลบสำเนาดังนั้น ขอบคุณมาก
Michael Mrozek

คำตอบ:


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 Monad การใช้>>ซึ่งเป็นประเภท (ตรวจสอบด้วย:t (>>)ในghci)

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

เรามี(runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")การรวมกันของX ()ประเภทสองประเภทX ()ด้วยและมันสามารถถูกผูกไว้กับกุญแจ

แก้ไขขาดหายไป)ในบรรทัดรหัสด้วย>>

Edit2 ->modmmodMask

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 (before run...)
sr_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.