Linuxのキーマッピングツール keyd を使ってみる

# はじめに

Ubuntuで使えるキーマッピングツールをいくつか試した結果、個人的にはkeydが一番使いやすそうでした。そこで、本記事ではその使い方についてまとめます。

# keydとは？

keydは、Linux向けの高機能なキーボードリマッピングツールです。GUIは提供されておらず、設定ファイルのみでキーマッピングを行います。

keydの特徴は、WaylandやX11（Xorg）などのディスプレイサーバーに依存せず、システム全体でキーの再割り当てを行える点です。類似するツールでxmodmapがありますが、xmodmapはX11（Xorg）専用であり、Waylandでは使えません。その点で、keydはより汎用性が高いツールと言えます。

# keydのインストール

以下のGitHubのREADMEにしたがってインストールします。

https://github.com/rvaiya/keyd

2025年5月17日現在は、apt等のパッケージマネージャではインストールできず、以下のように ``git clone``してインストールする必要がありそうです。

```
git clone https://github.com/rvaiya/keyd
cd keyd
make && sudo make install
sudo systemctl enable --now keyd
```

https://man.archlinux.org/man/keyd.1.en


# 設定ファイルの格納場所

keydの設定ファイルは、``/etc/keyd/default.conf``に書くのが一番シンプルな方法です。以下は、[GitHubのQuickStart](https://github.com/rvaiya/keyd?tab=readme-ov-file#quickstart)に書かれている例です。

```conf:/etc/keyd/default.conf
[ids]

*

[main]

# Maps capslock to escape when pressed and control when held.
capslock = overload(control, esc)

# Remaps the escape key to capslock
esc = capslock
```

ここで、keydのドキュメントの[CONFIGURATION](https://man.archlinux.org/man/keyd.1.en#CONFIGURATION)を見てみると、``/etc/keyd/``のディレクトリに`.conf` 拡張子のファイルとして格納されていれば、``/etc/keyd/default.conf``以外のファイル名でも問題ないようです。


# 事前確認

keydで使えるキーは、次のコマンドで確認できます。

```
sudo keyd list-keys
```

以下は出力例です。
```
$ sudo keyd list-keys | head -n 8
esc
escape
1
!
2
@
3
#
```

また、使っているキーボードの各キーがkeydでどのような名前で認識されるかを確認するには、以下のコマンドを実行します。

```
sudo keyd monitor
```

対話的に入力を受け付けるので、適当なキーを押すと、以下のような出力が得られます。

```
keyd virtual keyboard   0fac:0ade:bea394c0      enter up
keyd virtual keyboard   0fac:0ade:bea394c0      hangeul down
keyd virtual keyboard   0fac:0ade:bea394c0      hangeul up
```

# コンフィグファイルの書き方

## [ids]セクション

キーマッピングを適用するデバイスを記載するセクションで、設定ファイルはこのセクションから始める必要があります。

接続されているキーボードで使い分けを気にしなければ、以下のようにアスタリスク(*)を書けば問題ないです。

```
[ids]
*
```

特定のキーボードだけに適用したい場合は、次のようにキーボードのデバイスIDを書く必要があります。

```
[ids]
0123:4567
```

使っているキーボードのデバイスIDは、以下のコマンドで確認できます。

```
sudo keyd monitor | grep ^device
(終了する場合はCtrl+Cを押下)
```

以下は表示例です。
```
device added: 0123:4567:89abcdef HHKB-BT Keyboard (/dev/input/event23)
device added: 1234:5678:9abcdef0 Logitech MX Ergo Multi-Device Trackball  (/dev/input/event22)
...
```

## [main]セクション

キーマッピングの規則を書くセクションです。
例えば、以下のように書いたとします。

```conf:/etc/keyd/default.conf
[ids]
# 全てのキーボードデバイスが対象
*

[main]
esc = capslock
leftalt+s = volumeup
```

上記の設定を反映させるには、次のコマンドを実行します。
```
sudo keyd reload
```

この時、``esc = capslock`` により、ESCを押すとCapsLockとして認識されます。また ``leftalt+s`` は、「Left Alt と s を同時に押す」と音量を上げるVolume Upキーとして認識されます。ドキュメントだと、この同時押しのことを[chording](https://man.archlinux.org/man/keyd.1.en#Chording)と呼んでいます。

## Layerと修飾子

上記の例で、``leftalt+s``だと「Left Alt と s の同時押し」の意味になってしまうので、「Left Alt を押したまま s を押す」操作をしても Volume Upキーとして認識されません。これは、[layer](https://man.archlinux.org/man/keyd.1.en#Layers) という機能を使って以下のように書けば実現できます。

```conf
[main]
leftalt = layer(leftalt_layer)

[leftalt_layer]
s = volumeup
```

しかし上の書き方だと、もともと Left Alt として使えていたキーが「Left Alt を押したまま s を押すと、 Volume Up するキー」の機能のみしか使えなくなってしまいます。

実際に、 ``sudo keyd monitor`` を実行して、Left Altキーを押しても ``leftalt`` とは表示されないはずです。

そこで、次のように ``leftalt_layer``の定義に ``:A`` という修飾子を付けます。

```conf
[main]
leftalt = layer(leftalt_layer)

[leftalt_layer:A]
s = volumeup
```

このように書くと、元の Left Altキーの機能を残したまま、追加で s を押すと Volume Upができるようになります。

さらに[ドキュメント](https://man.archlinux.org/man/keyd.1.en#Layers)を読み進めてわかったのですが、今回のケースだともっとシンプルに以下のように書けば実現できました。（mainセクションも不要です）

```conf
[alt]
s = volumeup
```

これは、``leftalt``には暗黙的に``layer(alt)``が紐づいていて、``layer(alt)``の挙動を定義した``[alt]``にも暗黙的に``:A``の修飾子がついているためです。つまり、以下のような対応づけが既にされているということです。

```conf:（以下は記載不要）
[main]
leftalt = layer(alt)

[alt:A]
```



ちなみに修飾子は以下の5種類があります。

C - Control
M - Meta/Super
A - Alt
S - Shift
G - AltGr

もし、「Left Altを押したらCtrlキーとして使いたくて、さらに ``s`` を押したらVolume Upしたい」場合は、先ほどのような省略はできず、mainセクション、layer、修飾子``:C``を自分で書く必要があります。

```conf
[main]
leftalt = layer(leftalt_layer)

[leftalt_layer:C]
s = volumeup
```

## Macro

[macro](https://man.archlinux.org/man/keyd.1.en#MACROS)を使うと、特定のキーに一連のキー操作を割り当てられます。以下はその例です。

```conf
[main]
c = C-c                      # Ctrl+C
m = macro(C-c)               # Ctrl+C
e = macro(Hello space World) # "Hello World"
```

この例だと、cまたはmを押すとCtrl+Cとして動き、eを押すと"Hello World"と出力するようにマッピングしています。Ctrl+Cを表す``C-c``は、先程出てきた修飾子を使った表現で、「＜修飾子＞ー＜key＞」の記法になっています。この書き方の場合のみ、``macro()``で囲わなくてもいいようです。

ちなみに、修飾子の場合は２つ以上の重ねがけが可能です。例えば、

```conf
m = C-A-enter
```

のように書くと、mを押すと Crtl+Alt+Enterのキー操作がマッピングされます。


## 他にも様々なことができる

ここで紹介した機能以外にも、keydでは様々なキーマッピングを実現できます。ぜひ[公式ドキュメント](https://man.archlinux.org/man/keyd.1.en)を参考にしながら、ご自身に合った快適な設定を見つけてみてください！