komeの備忘録

東大院卒外資ITエンジニアの技術ブログ

Ubuntuでキーボードのマッピングをxmodmapで変更する(Ubuntu18.04対応)

私は普段HHKBを用いているが、Superキーだったり、半角全角キーだったりがJISキーボード的な配置のところにデフォルトでなくて悲しい思いをした。 汎用的なキーボードでキーマッピングを変更するやり方をまとめた。

環境
Ubuntu18.04 Desktop
HHKB Lite2 (JIS)

最初に

必要なアプリケーションをインストールするところから始まると思うが、今回用いるxmodmapとxevに関しては、ubuntu18.04ではプリインストールされていた。

なかったら、頑張ってインストールして下さい。

xmodmap

xmodmapは、Xorgにおけるキーマップやマウスボタンのマッピングを変更するためのユーティリティとして一般に用いられる。

簡単に言うと、使いこなせば好きなキーボードに好きな配置を作り出すことができる。

簡単な使い方は以下のQiitaによくまとまっているので、参考にしてほしい。

qiita.com

xev

ではまず、変更したいキーボードのキー情報を調べる。これには、xevというアプリケーションを用いる。

xevを起動すると、何やら不思議な四角い窓のGUIが立ち上がる。 xevは$ xevで起動する。 f:id:komee:20181024120509p:plain

四角い窓が見えている状態で、適当なキーを入力すると、そのキーの情報がコマンドラインに表示される。

実際にキーボードを変更する

今回は、HHKBのスペースキーの左横にSuperキーを配置したい。

xevによる用いたキー情報調査

ではまず、xevを用いてそのキーのkeycodeを調べる。

f:id:komee:20181024143411p:plain

xevによると、keycodeは102であった。

ちなみに、102のあとに続く()の中を読むと、キーバインドがされているキーであれば、なんのキーにバインドされているかがわかる。

今回の場合は、まだ何も割り当てられていないので、NoSymbolとなっている。

適用させるキー情報調査

次にkeycode 102に対応させるキーを調べる。

$ xmodmap -pke

上記のコマンドを実行することで、現在のキー情報の一覧が表示される。

ここでは、必ずどこかのキーの中にSuperキーがあると仮定して、その書き方を調べる。

$ xmodmap -pke | grep Super
keycode 133 = Super_L NoSymbol Super_L NoSymbol Super_L
keycode 134 = Super_R NoSymbol Super_R NoSymbol Super_R
keycode 206 = NoSymbol Super_L NoSymbol Super_L NoSymbol Super_L

Superキーに対応するキーがあり、その書き方が書いてあった。

ちなみにSuper_L以降にスペース区切りで記入されている文字は、シフトキーを押したときや、Altキーを押したときの操作となるらしい。

必要なのはとりあえずSuper_Lだけなので、今回はスペース以降は無視する。 (別にSuper_Rでも問題ないです。)

適用

では変更をワンライナーで終わらせる。

先程のキー情報一覧で出力した書き方と同様の文法で、xmodmapを用いてkeycode 102のキーを編集することで、実現できる。

$ xmodmap -e 'keycode 102 = Super_L'

このワンライナーで、変更はすぐに終わる。

システムログイン時に自動でキーバインドを変更するようにする

各自のログインシェルののrcファイルの末尾に、先程のワンライナーを記入しておくことで、システム起動時に自動的に読み込まれ、キーバインドを変更できる。

私の場合はzshを用いているので、~/.zshrcを変更することとなった。

$ vi ~/.zshrc

~中略~

# 以下を.zshrcの末尾に追記
# keymapping modification for HHKB
xmodmap -e 'keycode 102 = Super_L'

これで次回ログインしたときには自動的に読み込まれるようになった。 すぐに反映させたいときは、$ source ~/.zshrcでもよい。

まとめ

不満があるとすれば、今回の変更は接続しているすべてのキーボードに適応されてしまうことである。 僕の場合は、UbuntuはThinkPadに入っていて、そこにHHKBを接続して用いているが、keycode 102に対応するキーがThinkPadにもあった場合、そのキーにSuper_Lがマッピングされてしまう。

Macbookみたいに、キーボードごとにマッピングを変更できるやり方があったらいいなぁと思った。 もし知っている人がいたら、コメント欄で教えてください。

参考にしたサイト

xmodmap - ArchWiki

キーバインドの変更 Xmodmapの基本的な設定方法

(C) komee.org