【無料・無責任】キーリマッピングツール keyd 入門講座【完全図解?】
キーリマッピングツール keyd の無料&無責任な入門講座です。無料ですが、その代わりに中身がいい加減だったとしても責任は負いかねます。
はじめに: keyd 設定のポイント
私が思うに、keyd を設定する際のポイントは次の 3 つです。
- レイヤーと、レイヤーを操るアクションがわかれば、keyd の設定方法はだいたいわかる。
- keyd listen コマンドで監視すれば、どのレイヤーにいるのかがたちどころにわかって理解が進む。
- たった 4 行書くだけでアレを実現できる。
ですので、レイヤーの説明を多めでいきます。
注意事項
- 設定をミスると意図したとおりのキー入力が行えなくなる可能性があります。設定は慎重に行ってください。もしおかしな状況に陥った場合は、「Esc + BS + Enter」の同時押しを試してみてください。
- keyd は基本的に Linux 向けのツールであるため、FreeBSD 使うにはちょっと工夫が必要です。次の記事を参照してください。
- keyd を FreeBSD で使いたい (3) 【(一応) 完結編】https://retrotecture.jp/freebsd/enter_the_keyd3.html
keyd の設定ファイルについて
設定ファイルのありかは FreeBSD なら /usr/local/etc/keyd/default.conf です (Linux の場合は /etc/keyd/default.conf のようです)。
書式は Windows 界隈ではおなじみの INI ファイル風であり理解が容易です。
# keyd 設定ファイルの例
[ids]
*
[main]
capslock = layer(control)
最初は必ず [ids] セクションから始まります。ここには keyd の対象となるキーボードやマウスの ID を指定しますが、特にこだわりがなければワイルドカード (*) を指定しておけば大丈夫です。ID は後述の monitor コマンドで知ることができます。
5、6 行目は main という名前のレイヤーの定義で、CapsLock キーを Ctrl キーのようにふるまわせる設定です。詳しくはレイヤーのところでやります。
また、「#」で始まる行はコメントとみなされます。
便利なコマンド
keyd のコマンド群の中でもとりわけ役に立つと思うものを紹介しておきます。
monitor
このコマンドを起動しておいてキーボードからカタカタ入力すると、打ったキーの名前だとか、キーボードのデバイス ID だとかが表示されます。それらの情報は、設定ファイルを書くときに必要になります。
# keyd monitor
...
device added: 0fac:0ade:bea394c0 keyd virtual keyboard (/dev/input/event7)
device added: 0fac:1ade:d2b36ae6 keyd virtual pointer (/dev/input/event8)
keyd virtual keyboard 0fac:0ade:bea394c0 enter up
keyd virtual keyboard 0fac:0ade:bea394c0 leftshift down
keyd virtual keyboard 0fac:0ade:bea394c0 leftshift up
keyd virtual keyboard 0fac:0ade:bea394c0 leftshift down
keyd virtual keyboard 0fac:0ade:bea394c0 h down
keyd virtual keyboard 0fac:0ade:bea394c0 h up
keyd virtual keyboard 0fac:0ade:bea394c0 o down
keyd virtual keyboard 0fac:0ade:bea394c0 o up
keyd virtual keyboard 0fac:0ade:bea394c0 g down
keyd virtual keyboard 0fac:0ade:bea394c0 g up
keyd virtual keyboard 0fac:0ade:bea394c0 e down
keyd virtual keyboard 0fac:0ade:bea394c0 e up
keyd virtual keyboard 0fac:0ade:bea394c0 leftshift up
...
listen
このコマンドを起動しておくと、レイヤーの切り替わりが時々刻々と表示されます。レイヤーを理解するのにとても役に立ちました。使い方はレイヤーのところでやります。
reload
設定ファイルを再読み込みするときに使います。
# keyd reload
check
設定ファイルのチェックに使います。
% keyd check
Parsing /usr/local/etc/keyd/default.conf
No errors found.
レイヤーとは
最も単純なレイヤーの例
まずは何もしないレイヤーから始めましょう。
[main]
tab = layer(nav)
[nav]
- 最初は必ず main レイヤーから始まる。
- layer() は、バインドされたキーがホールド (長押し) されている間、指定されたレイヤーをアクティブにするためのアクション。
- この例では、Tab キーをホールドしたら nav レイヤーがアクティブになる。
- nav レイヤーにはなにもバインドされていないので、(ホールド中の Tab キー以外は) 普通に入力できる。「Tab をホールドする分、余計な手間がかかってるだけじゃないか」とも言える。
- Tab キーをリリースする (放す) と nav レイヤーを抜けて main レイヤーに戻る。
レイヤーは、キーボードの上にかぶせる入力支援シートのようなものをイメージするとよいかもしれません。「Tab キーをホールドしたら nav という名前のシートがキーボードに乗っけられた」てな感じに考えます (図 1)。
nav レイヤーにキーバインディングを追加する
このままじゃただ Tab キーを押しながら他のキーを打つだけの苦行みたいなレイヤーになってしまうので、nav レイヤーに何かバインディングを追加してみます。
[main]
tab = layer(nav)
[nav]
h = left
k = up
j = down
l = right
nav シートに機能が追加されて図 2 のような状態になります。Tab+H を押せば左矢印キー、Tab+L を押せば右矢印キーとなり、 vi チックな挙動となります。もちろん Tab をリリースすれば、nav レイヤーを抜けて main レイヤーに戻り、Tab も H も L もその他のキーも普通に入力することができます。
ちなみに、keyd listen すると、現在アクティブなレイヤーを知ることができます。
% keyd listen
/main ← 初期レイヤー
+nav ← Tab キー ホールド開始 (nav レイヤー ON)
-nav ← Tab キー リリース (nav レイヤー OFF)
...
main レイヤー
keyd の初期レイヤーは必ず main レイヤーとなります。main レイヤーでは、修飾キーを除くすべてのキーは、そのキー自身にバインドされています。修飾キーには Control、Meta (Super)、Shift、Left Alt、Right Alt の 5 種類があります (Control と Shift の左右は内部的には同じ扱いっぽい)。
修飾キーとそのレイヤー
その 5 種類の修飾キーは、keyd 内部で次のようにバインドされています。
control = layer(control)
meta = layer(meta)
shift = layer(shift)
leftalt = layer(alt)
rightalt = layer(altgr)
すなわち Control キーをホールドしたら、control レイヤーがアクティブになり、その他のキーも同様です。これらのレイヤーは keyd が暗黙的に定義済みです。
また、この暗黙的なレイヤーにキーバインドを追加することもでき、例えば次のように設定すれば、先ほどの nav レイヤーの「Emacs 版」となります。
# [main]
# control = layer(control) # ← 暗黙的にバインドされているので、なくても OK
[control]
b = left
p = up
n = down
f = right
気をつけたいのは、これをやってしまうと (当然ながら) アプリによっては副作用があるという点です。例えば Firefox なら、アドレスバーなどで Emacs ライクに Ctrl+B が効くようになってウハウハな反面、元のショートカットである「ブックマークサイドバーのトグル」が効かなくなってしまいます。
この問題を keyd の設定ファイルだけで解決するのは難しいと思いますが、コンポジットレイヤーや設定例 ex5 、 ex6 のところで次善の策を示します。
修飾キーのエミュレーション
レイヤー名の末尾に「:C」「:M」「:A」「:S」「:G」を付けると、そのレイヤーでは修飾キーがエミュレートされた状態になります。つまり修飾キーをホールドしていなくてもホールドしているかのように扱われます。
例えば次の例では、上矢印キーを 1 回押すと「大文字入力モード」になり、Shift キーを押さずともアルファベットキーだけで大文字を入力することができます (図 3)。スマホのソフトウェアキーボードみたいなイメージです。で、もう 1 回押すと元の状態 (main レイヤー) に戻ります。
[main]
up = toggle(ucase)
[ucase:S]
- toggle() はバインドされたキーがタップされる (1 回だけ押す) たびに指定されたレイヤーのアクティブ状態をトグルするアクション。
- 上矢印キーを押すたびに ucase レイヤーがトグルされる。
- ucase レイヤーには「:S」が付いているので、実際には Shift をホールドしていなくてもホールドしているかのように動作する。
以上をふまえると、マニュアルに載っている次の例:
[ids]
*
[control]
j = down
と
[ids]
*
[main]
leftcontrol = layer(control)
rightcontrol = layer(control)
[control:C]
j = down
が内部的には同じ意味であるということが納得できるんではないでしょうか?
アレ
ここまで理解できれば、いよいよアレを達成することができます。
[ids]
*
[main]
capslock = layer(capslock)
[capslock:C]
CapsLock をホールドすると capslock レイヤーがアクティブになります。で、capslock レイヤーは「:C」付きなので、(実際にホールドされていようがいまいが) Ctrl キーがホールドされていることになっています。結果として CapsLock キーが Ctrl キーであるかのようにふるまいます。
ところで、暗黙的に定義されている control:C レイヤーも名前は違えど機能的には capslock:C レイヤーと同じなので、次のように書いても結果は同じになります。
[ids]
*
[main]
capslock = layer(control)
コンポジットレイヤー
定義済みのレイヤーを組み合わせて新たなレイヤーを定義することもできます。
マニュアルに掲載されている次の例は、(暗黙的に定義された) control レイヤーと alt レイヤーがともにアクティブになったとき (つまり Ctrl キーと Alt キーが同時にホールドされたとき) に発動するレイヤーです。
[control+alt]
h = left
このレイヤーでは Ctrl+Alt+H で左矢印キーが出力されます。ちなみに、ここに設定されていないキーは、そのまま「Ctrl+Alt+そのキー」が出力されます。例えば F1 キーはここにないので、Ctrl+Alt+F1 がそのまま出力されます。
次の例は、先ほどの emacs 風 nav レイヤーをコンポジットレイヤーで実現してみた例です。emacs 風キーバインドに切り替えるために Meta (Super) キーを押すという手間が増える代わりに、元からあるショートカットと共存可能です。
[main]
meta = toggle(enav)
[enav]
[enav+control]
b = left
p = up
n = down
f = right
- Meta キーを 1 回タップすると enav レイヤーがアクティブになる。
- その状態で Ctrl キーをホールドすると control レイヤーもアクティブになり、その結果 enav+control レイヤーがアクティブになって Emacs ライクなキーバインドが使えるようになる。
- もう 1 回 Meta キーを押せば、toggle() によって enav レイヤーが非アクティブになるので、つられて enav+control レイヤーも非アクティブになる。
先ほどは Firefox のブックマークサイドバーを見殺しにする事態になってしまいましたが、今度は大丈夫です。アドレスバーへ入力する時のみ Emacs 風モードへ切り替える、といったことができるようになったからです。
ファイルのインクルード
別のファイルに設定を書いておいて、default.conf にインクルードすることができます。
- include 文を使って「include ファイル名」のように書く。
- [ids] セクションの後ならどこでもインクルードできる。
- インクルードされたファイルの中身が、インクルードされた位置にそのまま展開される。
制限事項:
- include 文を [ids] セクションの前に書くことはできない。
- インクルードされるファイルに [ids] セクションを書くことはできない。
- インクルードされるファイルが別のファイルをインクルードすることはできない。
- インクルードされるファイルの拡張子を「.conf」にすることはできない。
- ファイルの保存先は FreeBSD なら /usr/local/etc/keyd/ か /usr/local/share/keyd/、Linuxなら /etc/keyd/ か /usr/share/keyd/ とする。
設定例 ex4 のところでこの機能を使った例を示そうと思います。
マクロ
keyd では、マクロをキーにバインドすることもできます。いくつか例を挙げます。
Tab キーをタップしたら "hello, world!" と出力する。
tab = macro(hello, space world!)
Tab キーをタップしたら "hello,world!" と出力する (カンマの後ろのスペースは除去される)。
tab = macro(hello, world!)
Tab キーをタップしたら Alt+Meta+X を出力する。
tab = macro(A-M-x)
またはこうも書ける。
tab = A-M-x
詳細はマニュアルの MACROS のセクションを参照してください。
レイヤーを操るアクション (の一部)
すでに登場したものも含めて、よく使うであろう keyd のアクションを用例とともに紹介します。
layer(<layer>)
tab = layer(hoge)
Tab キーをホールドしている間、hoge レイヤーがアクティブになります。
oneshot(<layer>)
tab = oneshot(hoge)
Tab キーがタップされたら、hoge レイヤーがアクティブになります。その後、何らかのキー (Tab キーを含めて) が入力されたら hoge レイヤーを抜けて、元いたレイヤーに戻ります。
toggle(<layer>)
tab = toggle(hoge)
Tab キーがタップされるたびに、hoge レイヤーのアクティブ / 非アクティブが切り替わります。
マクロ機能付きアクション
keyd のアクションには、末尾に「m」が付くバージョンが用意されています。layerm() とか oneshotm() とか togglem() とか。「m」付きのバージョンでは、レイヤーがアクティブになる前にマクロを実行することができます。次の例では Meta キーで enav レイヤーに切り替える前に Meta+Alt+Shift+E というキーシーケンスを出力します。
[main]
meta = togglem(enav, macro(M-A-S-e))
[enav]
[enav+control]
b = left
p = up
n = down
f = right
使いどころとしては、出力された Meta+Alt+Shift+E をウィンドウマネージャー側で拾って enav モードに入ったことをタスクバーか何かに表示させる、といったことが考えられます。
overload(<layer>, <action>)
これはなかなか便利です。「ホールドされた場合にアクティブにするレイヤー」と「タップされた場合に実際に出力するキー」を合わせて指定することができます。
tab = overload(hoge, tab)
この例では、Tab キーがホールドされたら hoge レイヤーをアクティブにし、タップされたらそのまま Tab を出力します。つまりタップされたときの Tab キーとしての機能を維持しつつ、長押しされたときにはレイヤー切り替え機能を持たせる、といったことが可能です。
第 2 引数にはアクションを指定したり、
tab = overload(hoge, toggle(nav))
左辺のキーに合わせる必要もないので、別のキーをバインドしたりといったこともできます。例えば次のようにすると「CapsLock キーをホールドで Ctrl、タップで Esc」という Emacs 派も Vim 派もニッコリな挙動になります (けっこう定番の設定らしいです)。
capslock = overload(control, esc)
他にも便利そうなアクションがいろいろ用意されているので、一度マニュアルを覗いてみてください。
設定例
ex1) CapsLock キーの活用
長押しで Ctrl、タップで Esc:
[main]
capslock = overload(control, esc)
ex2) Space キー周りを英語キーボードっぽくする
無変換キーを左 Alt に、変換キーとカタひらキーを右 Alt に、メニューキーを右 Ctrl キーにすると、なんとなく英語キーボードっぽく見えませんか? (図 4)
設定ファイルはこう (キーの名前は keyd monitor コマンドで調べることができます):
[main]
muhenkan = layer(alt)
henkan = layer(alt)
katakanahiragana = layer(alt)
menu = layer(control)
ex3) タイル型ウィンドウマネージャー特化型レイアウト
タイル型ウィンドウマネージャーでは Meta キーを修飾キーとして使うことが多いので、これでもかとばかりにあちこち Meta キーを配置してみた例です。
[main]
leftcontrol = layer(meta)
rightalt = layer(meta)
henkan = layer(meta)
katakanahiragana = layer(meta)
ex4) インクルードされるファイルを書く
このあとの例で Emacs 風のキーバインドに切り替える設定を 2 パターン載せようと思うので、どちらの例からも共通にインクルードできるファイルを書いてみました。ファイル名の拡張子は「.conf」以外を付けるか、拡張子無しにしてください。
f = right
b = left
n = down
p = up
a = home
e = end
h = backspace
j = enter
k = macro(leftshift+end leftcontrol+x)
w = macro(leftcontrol+x)
y = macro(leftcontrol+v)
ほぼほぼ Emacs っぽさが醸し出されていると思いますが、マークセット (Ctrl+Space) だけは再現できませんでした。マークセットっぽいことをやりたかったら、その位置で Shift キーをホールドしながらカーソルを動かしてください。
ex5) Emacs 風モード その1
Emacs 風モードへの切替え例その1です。Capslock キーを 1 回タップしたら Emacs モードに入り、Emacs 風のキーバインドが有効になります。もう 1 回タップしたら main に戻ります。タップする手間はかかりますが、CapsLock という小指特区の一等地に鎮座するをキーを、そのまま修飾キーとして使うことができます。モードを OFF にすればアプリケーションに元から備わっているショートカットも使えます。
[main]
capslock = overload(control, toggle(emacslike))
[emacslike]
[emacslike+control]
include emacslike
ex6) Emacs 風モード その2
Emacs 風モードへの切替え例その2です。小指がつることでおなじみの左 Ctrl キーをそのまま使います。いちいちモード切替えをしなくてもいい点で、その1よりも優れています。小指の届きやすさでは劣りますが、Firefox とか Gimp とかで文字列を入力するときだけ使えればいい、と割り切れば大した問題ではないかもしれません。アプリケーションに元から備わっているショートカットは CapsLock を Ctrl とすることで対応可能です。
[main]
capslock = overload(control, esc)
leftcontrol = layer(emacslike)
[emacslike]
include emacslike
ただ実際やってみると、どちらの方法も「こいつはヤバそうだぞ!」と事前に妄想したほど快適じゃなかったです…。ぶっちゃけめんどくさいです。やはり全アプリ共通で Emacs のキーバインドがシームレスに使えるしくみが欲しいところ (Gnome アプリはそうなってるらしいけど…)。
ex7) 私の default.conf
最後に、私の default.conf を掲載します。インクルードしている emacslike ファイルは ex4 とまったく同じです。
[ids]
*
[main]
capslock = overload(control, togglem(emacslike, macro(M-A-S-e)))
leftcontrol = layer(meta)
rightalt = layer(meta)
henkan = layer(meta)
katakanahiragana = layer(meta)
muhenkan = layer(alt)
[emacslike]
[emacslike+control]
include emacslike
全文といってもこれまでに出した小片の寄せ集めですが…
- 5 行目: CapsLock ホールドで Ctrl キーに変身、タップするたびに Emacs 風レイヤーに切り替え。切り替えるたびに「Meta+Alt+Shift+E」を出力 (これをウィンドウマネージャー側で拾って、emacslike モードのアクティブ / 非アクティブ状態をタスクバーに表示しようと思います。別の記事でやる予定です)。
- 6 ~ 9 行目: 左 Ctrl、右 Alt、変換、カタカナ/ひらがなキーを Meta とする。ウィンドウマネージャー (私の場合は MangoWC) の修飾キーとして使うつもりのため。
- 10 行目: 無変換キーを Alt に。日本語キーボードを英語キーボードのレイアウトに寄せるため。
- 12 ~ 14 行目: Emacs 風レイヤーの定義。
最後にまとめ
- レイヤーと、レイヤーを操るアクションがわかれば、keyd の設定方法はだいたいわかる。
- keyd listen コマンドで監視すれば、どのレイヤーにいるのかがたちどころにわかって理解が進む。
- たった 4 行の設定ファイルでアレを実現することができる。



