왼쪽 Alt를 기본 모드 키로 사용하지만 일부 응용 프로그램에서는 Alt+키를 바인딩으로 사용하고 싶고 특정 응용 프로그램에서는 왼쪽 윙키를 모드 키로 사용하고 싶습니다.
logHook이 이 논리를 삽입하기에 적합한 장소인 것 같지만 이를 수행하는 방법을 이해하는 데 어려움을 겪고 있습니다.
크게 단순화된 구성은 다음과 같습니다.
import qualified XMonad.StackSet as W
import XMonad
import XMonad.Hooks.DynamicLog
main = do
-- some stuff
xmonad $ defaultConfig {
modMask = mod1Mask -- left winkey = mod4Mask, left alt = mod1Mask
, logHook = do
dynamicLogWithPP pp
}
어디
pp = dzenPP {
-- more stuff
}
logHook에서 현재 창의 이름을 얻을 수 있습니다.
winset <- gets windowset
let wname = fmap getName (W.peek winset) -- here I have some window identificator in Maybe
하지만 내 기본 기능의 defaultConfig에서 modMask를 동적으로 바꾸는 방법을 이해하지 못합니다.
하나의 작업 공간에 대해 모드 키가 다른 경우에도 기쁠 것입니다. 예를 들어 작업 공간 1~8에서는 Alt 키이고 작업 공간 9에서는 왼쪽 Winkey입니다. 이것도 좋은데, 이러한 솔루션은 현재 초점이 맞춰진 창을 기반으로 쉽게 수정될 수 있을 것입니다.
답변1
이것은 실패했습니다. XMonad는 예상대로 작동하지만 애플리케이션이 누른 키를 수신하지 않습니다. 내 말은, 다섯 번째 작업 공간에서는 modKey로 winkey를 사용하고 다른 작업 공간에서는 altkey를 사용하고 있다는 뜻입니다. 나는 작업 공간을 전환하기 위해 modKey+number를 사용하곤 했습니다. 다섯 번째 작업 공간에서 Alt+2를 누르면 XMonad는 아무 작업도 수행하지 않으며(올바른) 응용 프로그램도 아무 작업도 수행하지 않습니다(올바르지 않음). Chrome은 두 번째 탭 등으로 전환하지 않습니다.
좋아, 그래서 나는 그것을 사용하여 그것을 할 수 있었습니다XMonad.Actions.PerWorkspaceKeys.
관련 구성:
import XMonad.Actions.PerWorkspaceKeys
workspaceModkeys = [ (mod1Mask, map show ([1..4] ++ [6..9])) -- use Alt as modkey on all workspaces
, (mod4Mask, ["5"]) -- save 5th (use Win there)
]
modifiedKeysList conf =
[ ((0, xK_Return), spawn $ XMonad.terminal conf) -- launch a terminal
, ((shiftMask, xK_c ), kill) -- close focused window
]
unmodifiedKeys conf =
[ ((0, xF86XK_AudioPlay ), spawn "mpc toggle")
, ((0, xF86XK_AudioStop ), spawn "mpc stop")
]
keysList conf = concat (map modifyKey (modifiedKeysList conf)) ++ (unmodifiedKeys conf)
modifyKey :: ((KeyMask, KeySym), X()) -> [((KeyMask, KeySym), X())]
modifyKey k = map (f k) workspaceModkeys
where
f ((mask, key), action) (mod, workspaces) = ((mask .|. mod, key), bindOn (map (\w -> (w, action)) workspaces))
myKeys conf = M.fromList $ keysList conf
main = xmonad $ defaultConfig {
keys = myKeys
}
수정된 키 목록은 수정자와 함께 사용되며(이 예에서는 5번째 작업 공간에 Winkey가 있고 다른 모든 작업 공간에는 Alt가 그대로 유지됨) unmodifiedKeys 목록이 그대로 사용됩니다.
나중에 창별 키를 살펴볼 수도 있지만 지금은 그걸로 끝났습니다.