나는 왼쪽 Alt 키를 기본 모드키로 사용하고 있지만 특정 응용 프로그램에서는 Alt+키를 바인딩으로 사용하고 싶고, 해당 특정 응용 프로그램에서는 왼쪽 winkey를 내 모드 키로 사용하고 싶습니다.
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는 예상대로 작동하지만 응용 프로그램은 누른 키를 수신하지 않습니다. 즉, 5번째 작업공간에서는 winkey를 modKey로 사용하고, 다른 작업공간에서는 Altkey를 사용합니다. 저는 modKey+숫자로 작업 공간을 전환하곤 했습니다. 5번째 작업 공간에서 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 목록은 그대로 사용됩니다.
나중에 창별 키를 살펴볼 수도 있지만 지금은 끝났습니다.