저는 Xmonad를 사용하고 있으며 구성에 정의된 사용자 정의 키보드 단축키의 긴 목록이 있습니다.
누군가가 정의되지 않은 키 조합을 누르면 화면을 잠그는 catch all과 같은 것을 구성 하단에 추가하고 싶습니다. 따라서 다른 작업을 수행하도록 정의되지 않은 Ctrl+ *
또는 +는 화면을 잠가야 합니다.Alt*
현재 정의되지 않은 모든 조합을 나열하지 않고도 이를 수행할 수 있는 좋은 방법이 있습니까?
답변1
현재 정의되지 않은 모든 조합을 나열하지 않고도 이를 수행할 수 있는 좋은 방법이 있습니까?
이것은 단순히 "알 수 없는 조합을 잠그는 것"에 관한 것이 아니라는 점을 이해해야 합니다. 쉘 기록을 역검색하도록 허용하거나 즐겨 사용하는 오피스 제품군에서 인쇄 대화 상자를 여는 등 Control의 작업을 방지하고 싶지 않을 것입니다 .RControlP
목표를 달성하는 가장 깔끔한 방법은 XMonad에서 키 바인딩을 찾는 방식을 재정의하여 "찾을 수 없음"이 "잠금 화면"이 되도록 하는 것입니다. 불행하게도 XMonad는 사용자에게 이러한 기능을 제공하지 않습니다. XMonad 자체를 해킹해야 합니다.
다음으로 할 수 있는 최선의 방법은 유효한 모든 키 조합의 맵을 생성하고 이미 정의한 키 조합을 제거한 다음 나머지 모든 조합을 잠금 화면 명령에 바인딩하는 것입니다. 다행히도 이 모든 작업은 자동화될 수 있습니다.
화면 잠금 명령이 다음과 같이 정의되어 있다고 가정합니다.
lockScreen = spawn "i3lock"
키 조합은 마스크와 키로 구성되며 모두 목록에 나와 있습니다.Graphics.X11.Types
.
먼저 가능한 마스크 목록을 정의해 보겠습니다.
masks = [controlMask, mod1Mask]
Control여기서는 및 으로 시작하는 조합 만 차단한다고 가정합니다 Alt. 마스크는 8개가 있고 결합이 가능하므로 이 라인이 훨씬 더 복잡해질 수 있습니다. 그러나 여기서 정의하는 마스크가 많을수록 바인딩을 생성할 때 더 주의해야 합니다. 실수로 중요한 것을 차단하고 싶지는 않습니다.
좋습니다. 다음 정거장은 핵심 목록입니다. 이러한 항목은 에도 나열되어 Graphics.X11.Types
있으며 로 시작합니다 xK_
. 유형이 있지만 KeySym
그 진정한 본질은 무엇입니까 Word64
? 그러나 너무 무리하지 말고 이와 같은 작성을 피하는 것이 좋습니다. [0 .. maxBound :: KeySym]
그렇게 하면 많은 메모리를 소비하는 거대한 맵이 생성될 것입니다.
따라서 다루고 싶은 키의 수를 찾아 작은 정의로 그룹화하면 됩니다. 예를 들어, 여기에 가장 일반적인 키가 나와 있습니다.
keys :: [KeySym]
keys = [xK_Home .. xK_Num_Lock] ++ -- Cursor control & motion
[xK_KP_Space .. xK_R15] ++ -- Keypad and Function keys
[xK_space .. xK_asciitilde] -- ASCII and such
이제 키 바인딩 목록을 정의할 준비가 되었습니다.
fallbackKeys = [((mask, key), lockScreen)
| mask <- masks
, key <- keys ]
그러면 지정된 마스크와 키의 가능한 모든 조합에 대한 키 바인딩 정의가 생성됩니다.
이제 이러한 정의를 구성에 적용해야 합니다.
XMonad.Util.EZConfig
매우 유용한 것이 있습니다additionalKeys
결합기구성 및 키 바인딩 정의 목록이 주어지면 후자가 전자에 추가되고 충돌이 있는 경우 기존 정의를 덮어씁니다. 우리는 정반대를 원합니다. fallbackKeys
정의된 키 바인딩은 그대로 두고 정의되지 않은 위치만 채우는 방식으로 적용하고 싶습니다. 이를 달성하기 위해 우리는 또 다른 함수를 정의할 것입니다:
import qualified Data.Map as M
backupKeys :: XConfig a -> [((ButtonMask, KeySym), X ())] -> XConfig a
backupKeys conf keyList =
conf { keys = \cnf -> M.union (keys conf cnf) (M.fromList keyList) }
이것은 바로 복사하여 붙여넣는 것이지만 additionalKeys
매개변수는 Data.Map.union
우리가 원하는 동작을 생성하기 위해 교체됩니다. (바라보다union
작동 방식을 알아보기 위한 문서입니다. )
이제 드디어 모든 것을 사용할 수 있게 되었습니다. 어딘가에 xmonad.hs
다음과 같은 줄이 있습니다.
main = xmonad $ def {…} `additionalKeys` myKeys
다음과 같이 수정합니다.
main = xmonad $ def {…} `additionalKeys` myKeys `backupKeys` fallbackKeys
XMonad를 다시 컴파일하고 다시 시작하여 새로운 설정을 즐겨보세요!