프로그램이 실행중인 경우 xmonad에서 핫키의 동작을 어떻게 변경할 수 있습니까? the Windows

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+fwin+f. 어떻게해야합니까?



답변

보면 XMonad의있는 contrib 패키지 , 당신은 찾을 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가 생성 되고 master로 설정됩니다 .

선택하여 에뮬레이트 할 수 있습니다 극대화 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 ()있으므로 키에 바인딩 될 수 있습니다.

편집 )코드 줄에 누락>>

편집 2- modm > modMask.

Edit3 이것은 xmonad.hs잘 작동합니다.

( 하스켈에게 좋은 유익을 배우는 것은 어떻습니까? )


답변