概要
UbuntuでSandS(SpaceキーをShiftキーとして使う技)を実現します.xcapeというツールとxmodmapの合わせ技で利用できることがわかりました.alols/xcapeからxcapeをインストールし,次のようなコマンドを打ちます.
$ xmodmap -e 'keycode 255=space'; xmodmap -e 'keycode 65=Shift_L'; ~/opt/xcape/xcape -e '#65=space'
以下,詳細です.
はじめに
SandSを実現する方法としてSandS を linux に導入できる At Home Modifier が大変便利である件 - どせいけいさんき。を見つけました.しかしながら,At home modifier - Home - Open wiki - Gitoriousを見ると,At Home Modifierの作者さんはxcape(alols/xcape)に移行することを薦めておられます.ただ,xcape単体ではSandSを実現することはできなさそうでしたので,その方法を調べてみることにしました.
xcapeとは?
READMEによるとxcapeとは
xcape allows you to use a modifier key as another key when pressed and released on its own.
だそうです.つまり,ShiftキーやControlキーを他のキーに変換するツールです.起動すると常駐し,デフォルトではControlキーをただ押して離すとEscapeキーに変換してくれます.VimでEscapeキーを多用するような場合に便利そうですね.
SandS実現の手がかり
xmodmapとの組み合わせ
ところが,今実現したいことはSandSですから,Spaceキーを押している間に他のキーを押すと「Shift+他のキー」にしてくれるという機能です.これは,xcapeの機能ではできなさそうです.では,どうしたらよいのでしょう?そのヒントはxcapeのREADMEの下の方にありました.
If your s key has the code 42 and your l key 43 and you have set both to AltGr (a.k.a. ISO_Level3_Shift) with xmodmap, then this will generate the ordinary letters when pressed and released on their own.
で,この文中の「this」というのは
xcape -e '#42=s;#43=l'
というコマンドです.つまり,まず,xmodmapで予めキーボードの「S」と「L」にShiftキーを割り当て,その上で,SとLが単体で押された場合はもともとの文字をxcapeに出力させればよい,ということです.
xmodmapと組み合わせる場合の注意点
さて,READMEにはxmodmapとxcapeを組み合わせる場合の注意点が書いてあります.
The key you wish to send must have a defined keycode. So for example, with the default mapping Control_L=Escape, you still need an escape key defined in your xmodmap mapping. (I get around this by using 255, which my keyboard cannot send).
つまり,もともとのキーコードを示すシンボルは,keycode=255として保存しておいてね,ということだそうです.
SandSの実現
xcapeのインストール
原理はわかりましたので,xmodmap+xcapeによりSandSを実現しましょう. まずは,インストールです.xcapeコマンドは~/opt/xcapeにおくことにしました.
$ mkdir -p ~/opt/xcape
$ cd ~/opt/xcape
$ git clone https://github.com/alols/xcape.git .
$ make
key codeを調べる
xcapeをデバッグモードで起動します.
$ ~/opt/xcape/xcape -d
そして,Spaceキーを押すとkey codeが出力されますので確認します.私の場合,65でした.
設定する
以下のone linerを打ちます.
$ xmodmap -e 'keycode 255=space'; xmodmap -e 'keycode 65=Shift_L'; ~/opt/xcape/xcape -e '#65=space'
上のコマンドはワンライナーとして一気呵成に入力しないと,2番目のxmodmapコマンド実行後,Spaceキーが入力できなくなるので気をつけましょう.shellスクリプトにしておくのが良さそうです.
おわりに
xcapeのREADMEの読解に少々苦労しましたが,わかってみたらわりと簡単にSandSができました.ただ,今までxmodmapを使ったことのない方は少々戸惑われるかもしれません.また,READMEにある通り,「S」や「L」キーをシフトにするのも面白そうです(私はDvorakユーザですので,「O」と「N」ですかね).