Ubuntuで日本語キーボードのCapsLockをControlに変更する

はじめに

英語キーボードだけ使うようになって随分経つのですが、また日本語キーボードも併用できるようにしようと日本語キーボードも使い始めています。

英語キーボードでCapsLockとControl入れ替え

英語キーボードのときは以下のように設定変更してCapsLockとControlと入れ替えていました。

sudo sed -i 's/^XKBOPTIONS=.*/XKBOPTIONS="ctrl:swapcaps"/' /etc/default/keyboard

XKBOPTIONSの設定値は /usr/share/X11/xkb/rules/xorg.lst に書いてあります (man 5 keyboard のFILESセクションで知りました)。

反映はGNOMEをログアウト、ログインにしていましたが、Ubuntu/Caps-LockキーをCtrlキーにする方法 - Linuxと過ごす によると sudo systemctl restart console-setup で良いそうです。

日本語キーボードではCapsLockをControlに置き換え

CapsLockとControl入れ替えだとControl+Shiftを押したときにCapsLockが動いてしまうことがわかりました。

ターミナルでのコピーとペーストに Control+Shift+C と Control+Shift+V を多用するのでこれはつらいです。

そこで以下のようにCapsLockをControlにする設定を試してみました。

sudo sed -i 's/^XKBOPTIONS=.*/XKBOPTIONS="ctrl:nocaps"/' /etc/default/keyboard

が、これでも Control+Shift を押したときに CapsLock が動いてしまうようです。

gsettingsorg.gnome.desktop.input-sourcesxkb-options を確認してみたところ、以下のように ctrl:swapcaps になっていました。

$ gsettings get org.gnome.desktop.input-sources xkb-options
['ctrl:swapcaps']

以下のように gsettings でも ctrl:nocaps に設定すると期待の動きになりました。 gsettings set は追加の操作なしで即座に反映されるようです。

gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:nocaps']"

余談: ctrl:nocapscaps:ctrl_modifier の違い

検索してたら caps:ctrl_modifier というのもあることを知りました。 ただ /usr/share/X11/xkb/rules/xorg.lst の説明は以下のようになっていて違いがよくわかりません。

$ grep -E '(ctrl:nocaps|caps:ctrl_modifier)' /usr/share/X11/xkb/rules/xorg.lst
  ctrl:nocaps          Caps Lock as Ctrl
  caps:ctrl_modifier   Make Caps Lock an additional Ctrl

検索すると setxkbmap: What’s the difference between caps:ctrl_modifier and ctrl:nocaps? : commandline で2つの定義などがコメントされていました。

Ubuntu 22.04 LTS の環境では以下のようになっていました。

/usr/share/X11/xkb/symbols/ctrl

…(略)…
// Eliminate CapsLock, making it another Ctrl.
partial modifier_keys
xkb_symbols "nocaps" {
    replace key <CAPS> { [ Control_L, Control_L ] };
    modifier_map  Control { <CAPS>, <LCTL> };
};
…(略)…

/usr/share/X11/xkb/symbols/capslock

…(略)…
// This changes the <CAPS> key to become a Control modifier,
// but it will still produce the Caps_Lock keysym.
hidden partial modifier_keys
xkb_symbols "ctrl_modifier" {
    replace key <CAPS> {
        type[Group1] = "ONE_LEVEL",
        symbols[Group1] = [ Caps_Lock ],
        actions[Group1] = [ SetMods(modifiers=Control) ]
    };
    modifier_map Control { <CAPS> };
};
…(略)…

私の用途では ctrl:nocaps で良さそうです。

上のコメントでは左右のShift同時押しでCapsLockにする設定 shift:both_capslock も紹介されていました。

/usr/share/X11/xkb/symbols/shift

…(略)…
// Toggle CapsLock when pressed together with the other Shift key.
partial modifier_keys
xkb_symbols "lshift_both_capslock" {
  key <LFSH> {
    type[Group1]="TWO_LEVEL",
    symbols[Group1] = [ Shift_L, Caps_Lock ]
  };
};
// Toggle CapsLock when pressed together with the other Shift key.
partial modifier_keys
xkb_symbols "rshift_both_capslock" {
  key <RTSH> {
    type[Group1]="TWO_LEVEL",
    symbols[Group1] = [ Shift_R, Caps_Lock ]
  };
};
partial modifier_keys
xkb_symbols "both_capslock" {
  include "shift(lshift_both_capslock)"
  include "shift(rshift_both_capslock)"
};
…(略)…