X11でのキーマップの入替えはわりとよく資料を見かけますが、 生コンソールでの話はあまり見ないので書いてみます。
Keywords: console Shift+Caps Lock to Ctrl Control loadkeys localectl systemd-vconsole-setup
$Id: c7-caps-to-ctrl.html,v 1.2 2016-06-19 15:48:43+09 kabe Exp $
コンソール(X11ではないほう) の設定は、 /etc/vconsole.confに
格納されています。
KEYMAP=jp FONT=latacyrheb-sub16
で、ここの値は起動時に、systemd unit の
systemd-vconsole-setup.serviceが
/usr/lib/systemd/systemd-vconsole-setupプログラムを起動し、
その中で /usr/bin/loadkeys をさらに起動して
コンソールのキーマップが設定されます。
/etc/vconsole.conf
↓
systemd-vconsole-setup.service → systemd-vconsole-setup → loadkeys
コンソールのキーマップを変更するには loadkeys(1)を
使います。
#!/bin/loadkeys #include "jp106.map" include "/lib/kbd/keymaps/legacy/i386/qwerty/jp106.map.gz" # keymaps 0-1,4-5,8-9,12 # remap CapsLock to Control keycode 58 = Control shift keycode 58 = Caps_Lock # map Shift+KP_9 to console scroll shift keycode 73 = Scroll_Backward shift keycode 81 = Scroll_Forward # to increase scrollback buffer, add "fbcon=scrollback:128k" to kernel cmdline option
ファイルの書式についてはkeymaps(5)を見てください。
上記ファイルを jp106+.mapとでもで保存して、
sudo loadkeys jp106+.mapで適用します。
sudo が必要なのは、たぶんシステム挙動に深く関わるキー
(SysRq とか Ctrl-Alt-Del) のマップを一般ユーザーにいじられたくないからかも。
上記例では、
localectlRHEL7では、コンソールとX11のキーマップを同期させたいためか、
設定を別々に行うのではなく、
localectl(1)コマンドと systemd-localed(8)が
間に挟まって動くようになっています。
localectl → [D-Bus] → systemd-localed → /etc/vconsole.conf → loadkeys
\→ /etc/X11/xorg.conf.d/00-keyboard.conf
localectl status を行うと、X11をインストールしていなくても
$ localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp
X11 Layout: jp
VC (Virtual Console; 生コンソール) と X11 の設定が出てきますが、
そういうことです。
X11の設定はX11をインストールしていなくても存在しています。
なので、キーマップを恒久的に変えたいときは
/etc/vconsole.confを直接書き換えるのではなく、
localectl から変えるのが作法、ということになります。
systemd-localedは常駐せず D-Bus (org.freedesktop.locale1)にぶら下がっていて、
localectlを使うと systemd が
systemd-localed.service から起動します。
しばらく使わなければ消滅します。
systemd-localedはlocalectl(1)を使わなければ起動しないので、
OS起動時には使われません。
起動時は systemd-vconsole-setup がキーマップを設定します。
この辺の統一性のなさというか統合しようとしていろいろな要素が 追加されてしまうのが D-Busや systemd が嫌われる一因かも。
/usr/lib/kbd/keymaps/legacy/i386/qwerty/jp106+.map
として保存する。
jp106+が
追加されたことを確認する。
$ localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp106+
X11 Layout: jp
※X11のキーマップは変わっていません。
/etc/vconsole.confが書き換えられていることを確認。
作法的には localectlで変えるのが正しいのですが、
KEYMAP=jp106+ と書いて
Linux コンソール では PrintScreen キーが Compose キーとして割り当てられているので、 たとえば [PrintScreen]-[’]-[e] で é が直接入力できます。
が、半角¥マーク (0xA5) を入力するシーケンスは定義されていないので、 他のOSのように Compose = Y で ¥ を入力するには、 keymaps に以下を追加します:
compose '=' 'Y' to '¥'問題は最後の¥はちゃんとファイル上でも 0xA5 になっていなければならないこと。 普通に
vi jp106+.maps とすると
UTF-8モードになってファイル保存したときに別のコードになってしまうので、
vim では :set fileencoding=latin1 として8ビットモードに
する必要があります。
その上で、vim では ^V165 もしくは ^KYe で¥マークを挿入します。
Perl6で多用される半角セント記号¢(0xA2)も定義されていないので、使うなら
compose '|' 'c' to '¢'(頻用するなら旧OADGキーボードのように Alt-Shift-@ に割り当ててもよさそうですけど)