Edited at

UbuntuでSandSをxcape+xmodmapで実現する

More than 5 years have passed since last update.


概要

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」ですかね).