一日一万行感謝のプログラミング

読者です 読者をやめる 読者になる 読者になる

一日一万行感謝のプログラミング

ITエンジニアが書く普通のブログ

Linuxで自由自在にキーバインドを拡張する方法を試したら簡単だった

プログラミング

この記事は
クライアントのOSにLinuxを愛用していてキーバインドの変更や独自のショートカットキーの
割り当てをしたいと思っている人向けです。

xmodmapを利用するため、厳密にはX WINDOW SYSTEMを採用しているディストリビューション限定になります。(ここ曖昧)

基礎知識

キーには役割が大きく分けて2つあります。

  • 1つは「a,s,d,f」などの単純な入力を担うキー
  • 2つめは「Shift, Alt」など他のキーとの組み合わせによって入力パターンを増やす元となるキー

後者をモディファイヤキーと呼びます。

解説

今回はキー入力の拡張性を広げるために上記のモディファイヤキーを増やしたいと
思います。

その方法ですが現在は使われていないモディファイヤキー(AltGr)に
他のキーをバインドする事によってそれを実現したいと思います。

そして、私がその拡張のキーに選んだのが「セミコロン」です。
セミコロンはホームポジションの小指に位置している事と
後に登場するワンショットモディファイヤとの兼ね合いで
このキーを選択することになりました。

最終的なキーマップはこんな感じです。
セミコロン + e → Up
セミコロン + d → Down
セミコロン + s → Left
セミコロン + f → Right
セミコロン + a → Home
セミコロン + g → End
セミコロン + h → BackSpace
セミコロン + j → Return(Enterキー)
セミコロン + k → Delete
セミコロン(短くトンッと押す) → セミコロン
セミコロン(長く押してから離す) → 入力なし

ホームポジションから極力手を動かさずに日常的に
利用しているキーのバインドを増やすことにします。

この設定を実現するためにはまずセミコロンを
モディファイヤキーに割り当てますが
ココで問題が発生します。

モディファイヤキーに割り当てるとセミコロン本来の機能が
失われてしまうということです。

そこで登場するのがワンショットモディファイヤの
設定です。

ワンショットモディファイヤとは
モディファイヤキーを押してから放した時(トンッと短くです)の入力です。

キーのイベントは3種類あります。

  • キーを押した時
  • キーを押したままにした時
  • キーを離した時(以後、「リリース」と呼びます)

もともとセミコロンだったキーを追加のモディファイヤキーにしてしまうため、
この方法でキー本来の機能を残します。

これで普段はモディファイヤキーの機能でありながら
トンッっと押した時はセミコロンが入力されるようなキーになるわけです!

ちなみに、この方法には弱点があります。
今回はその弱点を克服するためにセミコロンをモディファイヤキーにしています。

その弱点とは
リリースイベントは通常の入力よりも発生が少し遅くなります。
なので「a、s、d、f」などのキーにバインドしてしまうと入力が
遅れる事を実感する事になると思います。

しかしセミコロンを入力するときは必ず連続した入力の最後になります。
そのため実用上の入力の遅延を感じにくいのです。
上記の理由とホームポジションにあるキーということで「セミコロン」が選ばれたわけです。

※実際キーリリース時の入力でも気にするほど入力は遅くなりません^^

設定

キーマップの設定はxmodmapを利用します。


設定対象になるキーのキーコードを調べなければなりませんが


キーコードはxevを起動して任意のキーを押すとそのキーの情報をとる事が出来ます。

$ xev

サンプルは私のキーコードです。
異なる場合もありますので、ご注意ください。

設定ファイルを作成して内容を記載した後に

$ xmodmap <config-file>

でファイルを読み込むとキーマップの変更が適用されます。
が注意点もあるので、説明を先に見ていただけると助かります。

設定ファイルの内容はこちらです。

keycode 47 = Mode_switch
keycode 255 = semicolon

keycode 26 = e E Up Up
keycode 38 = a A Home Home
keycode 39 = s S Left Left
keycode 40 = d D Down Down
keycode 41 = f F Right Right
keycode 42 = g G End End
keycode 43 = h H BackSpace BackSpace
keycode 44 = j J Return Return
keycode 45 = k K Delete Delete

左から順番に配置します。
Keycode <番号> = <単体入力> < + Shift入力> < + Mode_switch入力> < + Shift + Mode_switch入力>
というように設定します。

私のPCのセミコロンのキーコード47番にMode_switchを割り当てます。

その後、空いているキーコード255にセミコロンをバインドします。
これはどのキーにもバインドされていないと後のワンショットモディファイヤの設定の際に
セミコロンが指定できなくなってしまう状態への対策です。

$ xmodmap -pke

で全てのキーマップが表示できますが
大体250~255が空席になっていると思います。

上記の設定を書き込むファイルを作りましょう。名前はなんでも大丈夫です。
そしてxmodmapに読み込ませます。

$ vi <config-file>
$ xmodmap <config-file>

ここまで設定できたら
セミコロンのキーを押しながら
hを押すとバックスペースの役割をしたり、
その他のキーもバインドされていると思います。

ただセミコロンのキーを単体で押しても反応はありませんね。
そこで次の設定です。

ワンショットモディファイヤの設定

次にモディファイヤの設定ですがコチラはツールを使って行いたいと思います。

xcape(
github.com

xcapeをインストールします。

$ sudo apt-get install git gcc make pkg-config libx11-dev libxtst-dev libxi-dev
$ git clone https://github.com/alols/xcape.git
$ cd xcape/
$ make
$ sudo make install

コマンドラインから設定を実行します。

$ xcape -e "Mode_switch=semicolon"

これでセミコロンがキーリリース時に入力されるようになるはずです。

さらにxcapeは下記のコマンドを実行した時と同じ設定が標準で盛り込まれています。

$ xcape -e "Control_L=Escape"

CtrlのワンショットモディファイヤがEscになっているわけですね。

Caps_lockをCtrlキーにバインドしている場合は

$ xcape -e "Caps_Lock=Escape"

も同時に設定すると
完全にCtrlもワンショットモディファイヤでEscが入力されるようになります。

xcapeの説明にもありましたが、この設定はvimユーザにはありがたい設定だと思いますので
活用してみてください。

終わりに

どうでしょうか?
設定は上手くいきましたでしょうか?

他に利用したコマンドを記載しておきますね〜

xcapeの設定を初期化

$ killall xcape

ご質問や間違った内容や解説のご指摘などなどのコメントお待ちしております~



※なにか作業をしようと思って入ったカフェの名前が完全に追加のキーバインドだったので
執筆に至りました。感謝。


f:id:ara1yu:20170211185043j:plain