Xmonad:すべてのキーボードショートカットをキャプチャ

Xmonad:すべてのキーボードショートカットをキャプチャ

私は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を再コンパイルして再起動し、新しい設定をお楽しみください!

おすすめ記事