2017-10-14

特定のキーボードだけキー配列を変更する

私はノートパソコンにUSB接続のHHKBを接続しているのだが, ときどきノートパソコン上のキーボードを使用することがある. このとき, Controlキーやバックスペースの違いにとまどうことがある. この回避策として, ノートパソコンのキーボードだけキーコードを変更する方法をメモする.
使用しているOSは, Fedora release 25である.

キーコードの変更手順

キーの入れ替えには, setxkbmap を使用する. このコマンドは, どのディバイスに対して適用するかを指定できる.

まず, キーを入れ替えるための設定ファイルを用意する.

$ cat /usr/share/X11/xkb/keycodes/swapctrlcaps
default
xkb_keycodes "swapctrlcaps" {
        <LCTL> = 66;
        <CAPS> = 37;
};

$ cat /usr/share/X11/xkb/keycodes/swapbacks
default
xkb_keycodes "swapbacks" {
        <BKSL> = 22;
        <BKSP> = 51;
};
これで, 以下のコマンドにより, qwerty配列に対して上記のキー入れ替えができる.
$ setxkbmap -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'

次に, xinput を使用して, 接続されたディバイスの一覧を取得する. (空白などを改変した)

$ xinput
Virtual core pointer                   id=2  [master pointer  (3)]
  Virtual core XTEST pointer           id=4  [slave  pointer  (2)]
  TPPS/2 IBM TrackPoint                id=10 [slave  pointer  (2)]
Virtual core keyboard                  id=3  [master keyboard (2)]
  Virtual core XTEST keyboard          id=5  [slave  keyboard (3)]
  Power Button                         id=6  [slave  keyboard (3)]
  Video Bus                            id=7  [slave  keyboard (3)]
  Sleep Button                         id=8  [slave  keyboard (3)]
  AT Translated Set 2 keyboard         id=9  [slave  keyboard (3)]
  ThinkPad Extra Buttons               id=11 [slave  keyboard (3)]
  Topre Corporation HHKB Professional  id=13 [slave  keyboard (3)]
このうち, AT Translated Set 2 keyboard だけに, キーコードの変更を行う.
setxkbmap -device 9 -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'
これをスクリプトにすると, 以下のようになる.
for id in $(xinput | awk '/AT Translated Set.*id=[1-9]/{print gensub(/.*id=([0-9]*).*/,"\\1",1)}'); do
        setxkbmap -device $id -keycodes 'evdev+aliases(qwerty)+swapbacks+swapctrlcaps'
done

補足: キーマップの異なるキーボードが混在する環境の設定

もし, 日本語キーボード・英語キーボード混在の場合は, シンボルを設定するオプション -symbols を使用する. 以下の例では, id=9 に日本語, id=13 に英語の配列を割り当てる.
setxkbmap -device  9 -symbols 'pc+jp+inet(evdev)'
setxkbmap -device 13 -symbols 'pc+us+inet(evdev)'

0 件のコメント:

コメントを投稿