Featured image of post CachyOS + KDE Plasma(Wayland)で物理的に壊れたキーをkeydで代用する

CachyOS + KDE Plasma(Wayland)で物理的に壊れたキーをkeydで代用する

キーボードの :(コロン)/;(セミコロン)キーが壊れてしまい、入力できなくなりました。物理キーを買い替える前に、使っていないキーの組み合わせで代用できないか試してみました。

  • OS: CachyOS(Arch系)
  • デスクトップ環境: KDE Plasma(Wayland)

Waylandでは、X11のsetxkbmapのような手軽な方法が使えないことが多く、GUIのキーボード設定でも「Alt+P → ;」のような任意のキー組み合わせへのカスタムマッピングはできません。そこで、カーネルレベルで動作しX11/Wayland/デスクトップ環境を問わず使えるkeydを採用しました。

keydとは

keydはLinuxのキーリマップ用デーモンで、/dev/inputのイベントを直接フックして仮想キーボードとして出力し直します。ディスプレイサーバーやウィンドウマネージャーに依存しないため、Wayland環境でも問題なく動作します。

インストール

sudo pacman -S keyd

設定

/etc/keyd/default.conf を作成します。

[ids]
*

[main]
leftalt = overload(altremap, leftalt)
rightalt = overload(altremap, rightalt)

[altremap]
p = semicolon
o = S-semicolon

ポイントは以下の通りです。

  • overload(altremap, leftalt) によって、Altキーは単独で押せば通常のAltとして機能し、他のキーと同時に押されたときだけaltremapレイヤーが有効になります
  • p = semicolonAlt+P → ;
  • o = S-semicolonAlt+O → :(Shift+セミコロン相当)

サービスを有効化します。

sudo systemctl enable --now keyd

ハマった所: 右Ctrlで日本語変換ができなくなった

設定を反映した直後、右Ctrlキーによる日本語入力の変換切り替え(fcitx/ibus)が効かなくなる問題が発生しました。

sudo keyd monitor で右Ctrlキーを押したときのイベントを確認したところ、原因がわかりました。

keyd virtual keyboard   0fac:0ade:bea394c0      leftcontrol down
keyd virtual keyboard   0fac:0ade:bea394c0      leftcontrol up

右Ctrlキーを押しているのに、keydの出力はleftcontrolになっていました。これでは右Ctrl固有のショートカットに割り当てていたIMEの変換トリガーが反応しません。

[main]セクションに右Ctrlを明示的にそのまま通す設定を追加します。

[main]
leftalt = overload(altremap, leftalt)
rightalt = overload(altremap, rightalt)
rightcontrol = rightcontrol

これで右Ctrlが正しくrightcontrolとして出力されるようになり、日本語変換も元通り動くようになりました。

最終的な設定ファイル

[ids]
*

[main]
leftalt = overload(altremap, leftalt)
rightalt = overload(altremap, rightalt)
rightcontrol = rightcontrol

[altremap]
p = semicolon
o = S-semicolon

Wayland環境でもkeydを使えばDE非依存でキーの自由なリマップができます。overload()を使うと、修飾キーの通常の機能を保ったままレイヤー切り替えキーとしても使えるのが便利でした。

keydはデフォルトで一部のキー(今回の場合は右Ctrl)を暗黙的に別のキーとして正規化して出力することがあるようです。既存のショートカットに影響が出た場合はsudo keyd monitorで実際の出力イベントを確認し、必要なキーは明示的にパススルー設定するとよさそうです。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。