프로그램이 실행 중인 경우 xmonad에서 단축키 동작을 어떻게 변경합니까?

프로그램이 실행 중인 경우 xmonad에서 단축키 동작을 어떻게 변경합니까?

구성 파일에서 일부 키맵을 사용하고 있습니다 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. 어떻게 해야 합니까?

답변1

보고 있다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 모나드에서. 유형이 다음과 같은 을 사용하십시오 >>( :t (>>)in 에서 확인 ghci).

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

(runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")또한 키에 바인딩할 수 있도록 두 가지 유형의 조합이 있습니다 .X ()X ()

)편집 코드 줄이 누락되었습니다.>>

편집 2 modm-> modMask.

편집 3 이것은 xmonad.hs잘 작동합니다.

(Haskell을 배워서 큰 이점을 누리는 것은 어떨까요?)

관련 정보