【FreeBSD】仮想コンソールのキーマップを自分好みにしたい

確認環境

PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.0-RELEASE-p3

課題

一般的な日本語キーボードのキー配置は、ESCキーが左上にある。
ホームポジションから果てしなく遠い。
vimユーザには死活問題だ。
Normalモードに戻るためにCtrl+[なんて打ってられない。
ESCキーを使う各アプリでキーバインドを変更するのも面倒だ。。。

対策

そうだ、仮想コンソールのキーマップを変更しよう。

キーマップは下記手順で変更することができる。
(X Window Systemには影響しない)

  1. /usr/share/vt/keymaps/*の、キーマップファイルを修正
  2. kbdcontrol -l xxx.kbdで、期待通り設定できているか確認
  3. /etc/rc.confの、PC起動時に使うキーマップファイルを変更

手順1で、今使っているキーマップファイルを上書き変更する場合は、手順3は要らない。

以降はroot権限で実行する前提で説明する。

1. キーマップファイルを修正

まずはキーマップファイルを修正する。
ここではベースとなるキーマップファイルをコピーして、それを修正することにした。

> cd /usr/share/vt/keymaps/    # syscons(4)の場合は /usr/share/syscons/keymaps
> cp jp.kbd jp.my.kbd
> vim jp.my.kbd

キーマップファイルの中身は下記のようになっている。

# $FreeBSD: releng/12.0/share/vt/keymaps/jp.kbd 270156 2014-08-18 21:07:12Z se $
#                                                         alt
# scan                       cntrl          alt    alt   cntrl lock
# code  base   shift  cntrl  shift  alt    shift  cntrl  shift state
# ------------------------------------------------------------------
  000   nop    nop    nop    nop    nop    nop    nop    nop     O
  001   esc    esc    esc    esc    esc    esc    debug  esc     O
  002   '1'    '!'    nop    nop    '1'    '!'    nop    nop     O
  003   '2'    '"'    nop    nop    '2'    '"'    nop    nop     O
  .
  .
  .

各列を左端からざっくり説明すると

  • scancode ... キー固有の番号
  • base ... キー単独で押したときのアクション
  • shift ... キーをShiftキーと一緒に押したときアクション
  • cntrlshift ... キーをCtrl+Shiftキーと一緒に押したときのアクション

     (〜中略〜)

  • lockstate ... キーがCaps Lock / Num Lockの影響を受けるか

みたいな感じ。

変更したいキーが割り当たっている行の各項目を、希望するアクションに変えればいい。

例えば、Ctrl+Shift+1キーでシャットダウンしたいとする。
上記ファイルのscancode列が002の行はbase列が'1'となっているので、数字1キーだということが分かる。
さらにshift列が'!'となっているため、10キーではなくQキーの上の数字1キーだ。
この行のcntrlshift列(左から5列目)のnoppdwnに変えればいい。

指定できるアクションの種類については、man 5 kbdmap で確認してねと。
僕が使いたくなりそうなものだけ下記に抜粋。

記述 アクション
alt, lalt, ralt Altキー
ctrl, lctrl, rctrl Ctrlキー
lshift, rshift Shiftキー
meta metaキー
'symbol' 特定の文字('A','1',':' など)
hs Tab
btab Backword Tab
bs Backspace
del Delete
cr Carriage Return (Enter)
nl New Line (デフォルトだとCtrl+Enterに割り当てられてるっぽい)
esc Escape
clock Caps Lock
nlock Num Lock
slock Scroll Lock
pdwn Power Off
boot Reboot
susp Suspend
saver splash/text screen
fkeyN Functionキー(fkey1,fkey2...詳細はman 4 atkbdを参照)
paste 貼り付け(moused有効時の?)
nop 何もしない

 
最後のlockstate列には下記が指定できる。

記述 影響を受けるLock
C Caps Lock
N Num Lock
B Caps & Num Lock (両方)
O(英字大文字のオー) 影響を受けない

CやBを指定すると、Caps Lock中はshift列に指定したアクションが有効になるっぽい。
Num Lock中は、挙動がよく分からなかった。
知っている方がいたらコメント頂けると助かります。
 

例 1) CapsLock を ESC へ変更

CapsLockキー単一で押したときにESCとして、Shiftキーと一緒に押したときはCapsLockのままにする。
(その他のキーとの同時押しはESC)

  058   clock  clock  clock  clock  clock  clock  clock  clock   O
  ↓
  058   esc    clock  esc    esc    esc    esc    esc    esc     O

 

例 2) 変換 を Enter、 無変換 を Ctr へ変更l

変換キー、無変換キーがどれなのかマニュアルを読んでもよく分からない。
とりあえず、僕の環境では下記で変更できましたとさ。

  121   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O
  123   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O
  ↓
  121   cr     cr     nl     nl     cr     cr     nl     nl      O
  123   lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl   O

 

2. 期待通り設定できているか確認

キーマップファイルを変更したら、動作確認だ。
下記コマンドを実行すると設定が反映されるので、期待通りのキー割り当てになっているか確認しよう。

> kbdcontrol -l /usr/share/vt/keymaps/jp.my.kbd     # 実際に修正したファイルパスを指定

ちなみにuim-feptmux上でコマンドを実行するとエラーが出るので、素のvt上で実行してねと。
 

3. PC起動時に使うキーマップファイルを変更

納得のいくキーマップファイルができたら、PC起動時に自動で反映させよう。
/etc/rc.confkeymapを下記のように変更すれば良い。

keymap="jp.my.kbd"      # 実際に修正したキーマップファイル名を指定

再起動後にキーマップが反映されるようになっているはず。

おまけ

kbdmapコマンドから追加したキーマップファイルを選択できるようにしたい場合は、
/usr/share/vt/keymaps/INDEX.keymapsを修正すればいいみたい。
 
 
 
以上。

FreeBSDコマンドブック ビギナーズ

FreeBSDコマンドブック ビギナーズ