Linux マシンの US キーボードの CapsLock を Ctrl に変更する方法を調べました。いろんなやり方があるようです。
環境
- OS: Arch Linux x86_64
- ホスト: MacBookAir6,2 1.0
- デスクトップ環境: Xfce 4.18
いろんな設定方法
- xmodmap
- setxkbmap
- Xorg の設定ファイル
- グラフィカルユーザインターフェース(GUI)
xmodmap で設定する場合
xmodmap は Xorg におけるキーマップやマウスボタンのマッピングを変更するためのユーティリティです。-- ArchWiki
Xorg ディスプレイサーバーが起動するときに、/etc/X11/xinit/xinitrc
が読み込まれます。
読み込まれるものの中に $HOME/.Xmodmap
という Xmodmap の設定ファイルがあります。
xmodmap は Xorg におけるキーマップやマウスボタンのマッピングを変更するためのユーティリティです。-- ArchWiki
最初はないと思うので、$HOME/.Xmodmap
を作ります。
ArchWiki によると以下の設定で CapsLock を Ctrl に変更できるそうなのでおまじないとして貼り付けます。
clear lock
clear control
keycode 66 = Control_L
add control = Control_L Control_R
以上!
これで設定が永続化されているはずです。
僕のマシンでは /etc/X11/xinit/xinitrc
の中身はこんな感じでした。
ここで $HOME/.Xmodmap
が読み込まれることがわかると思います。
#!/bin/sh
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap
# merge in defaults and keymaps
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi
if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi
if [ -f "$userresources" ]; then
xrdb -merge "$userresources"
fi
if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi
# start some nice programs
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
[ -x "$f" ] && . "$f"
done
unset f
fi
twm &
xclock -geometry 50x50-1+1 &
xterm -geometry 80x50+494+51 &
xterm -geometry 80x20+494-0 &
exec xterm -geometry 80x66+0+0 -name login
ちなみに /etc/X11/xinit/xinitrc
は初期設定のままにしておくのが作法のようです。
万一挙動を変更したい場合は、$HOME/.xinitrc
を作るとこれが代わりに読み込まれるようになるとのことです。
cp /etc/X11/xinit/xinitrc ~/.xinitrc
また、ウィンドウマネージャが開始される前にコマンドを実行したい場合は、$HOME/.xprofile
ファイルを作りその中で実施します。
setxkbmap で設定する場合
setxkbmap は、キーボードレイアウトの設定ができる便利なコマンドです。現在の X セッション限定でキーボードレイアウトを設定します。
以下のコマンドを実行して CapsLock を Ctrl に変更することが可能です。
setxkbmap -option ctrl:nocaps
いつでも設定変更ができて便利ですが、このコマンドを打つだけでは設定は永続化されません。
いつでも CapsLock をオンオフできるようにコマンドを用意しておくと便利かもしれません。
#!/bin/bash
# Usage
#
# capslock on
# capslock off
#
[ "$1" == on ] && setxkbmap -option
[ "$1" == off ] && setxkbmap -option ctrl:nocaps
Xorg の設定ファイルで設定する場合
/etc/X11/xorg.conf
や /etc/xorg.conf
で Xorg を設定することもできます。
僕のマシンでは /etc/X11/xorg.conf.d/00-keyboard.conf
というファイルがあり、その中にキーボード関連の設定が記述されています。
コメントを読むとこれは自動生成されたものなので、どうも触らないほうがよさそうです。
# Written by systemd-localed(8), read by systemd-localed and Xorg. It's
# probably wise not to edit this file manually. Use localectl(1) to
# instruct systemd-localed to update it.
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
Option "XkbModel" "pc105+inet"
Option "XkbOptions" "terminate:ctrl_alt_bksp"
EndSection
localectl コマンドを使用して systemd-localed にキーボード設定を更新するよう指示を出せる仕組みになっているようです。
localectl コマンドでキーボード設定を更新する文法は以下のとおりです。サブコマンドは set-x11-keymap
で、引数を四つ取ります。
localectl set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]]
まずは現在の設定を確認します。Xorg の設定ファイルを直接覗く以外にも確認する方法があります。
localectl status
# System Locale: LANG=en_US.UTF-8
# VC Keymap: us
# X11 Layout: us
# X11 Model: pc105+inet
# X11 Options: terminate:ctrl_alt_bksp
setxkbmap -print -verbose 10
# Setting verbose level to 10
# locale is C
# Trying to load rules file ./rules/evdev...
# Trying to load rules file /usr/share/X11/xkb/rules/evdev...
# Success.
# Applied rules from evdev:
# rules: evdev
# model: pc105+inet
# layout: us
# options: terminate:ctrl_alt_bksp
# Trying to build keymap using the following components:
# keycodes: evdev+aliases(qwerty)
# types: complete
# compat: complete
# symbols: pc+us+inet(evdev)+terminate(ctrl_alt_bksp)
# geometry: pc(pc104)
# xkb_keymap {
# xkb_keycodes { include "evdev+aliases(qwerty)" };
# xkb_types { include "complete" };
# xkb_compat { include "complete" };
# xkb_symbols { include "pc+us+inet(evdev)+terminate(ctrl_alt_bksp)" };
# xkb_geometry { include "pc(pc104)" };
# };
確認した現在の設定をもとに設定変更をするコマンドを組み立てます。四つの引数をどうするかの問題です。
- LAYOUT
- MODEL
- VARIANT
- OPTIONS
使用可能なパラメータ値は以下のコマンドで確認できます。
localectl list-x11-keymap-models
localectl list-x11-keymap-layouts
localectl list-x11-keymap-variants [layout]
localectl list-x11-keymap-options
僕の場合はこうなりました。VARIANT は該当しないので空にしています。変更したのは OPTIONS だけです。
sudo localectl set-x11-keymap \
"us" \
pc105+inet \
"" \
terminate:ctrl_alt_bksp,ctrl:nocaps
リブート後に設定が反映され永続化されているはずです。
グラフィカルユーザインターフェース(GUI)
僕の(今使っている)マシンにはないのですが、Linuxディストリビューション によっては便利なグラフィカルユーザインターフェース(GUI)が付いてくる場合があります。
例えば、Linux Mint ではチェックボックスで簡単にキーボード設定の変更ができます。
さいごに
本記事は autoracex #257 の成果です。ありがとうございます。