メモ
Ubuntu 26.04 LTS (Resolute Raccoon) でキーボードを2点カスタマイズするメモ。
- Caps LockキーとCtrlキーを入れ替える
- Ctrl + Space で日本語入力(Mozc)と直接入力を切り替える
Ubuntu 26.04 LTSはGNOME
50を採用しており、GNOME-on-X11セッションが廃止され、デスクトップはWaylandのみで動作する点に注意(XWaylandは引き続き利用可能)。これに伴い、xmodmap
や setxkbmap
といったX11時代の小技は使えない(XWaylandアプリにしか効かない)ため、GNOME本体の設定や低レイヤなツールを使う必要がある。
環境
- Ubuntu 26.04 LTS (Resolute Raccoon)
- GNOME 50 / Wayland セッション
- USキーボード(JISでも考え方は同じ)
Caps LockとCtrlの入れ替え
方法1: GNOME Tweaks(GUI)
一番手軽なGUI手順。Tweaksを入れていない場合は先にインストールする。
1 | $ sudo apt install gnome-tweaks |
Tweaksを起動して以下を辿る。
- 左メニューの「Keyboard」(キーボードとマウス)を開く
- 「Additional Layout Options」をクリック
- 「Ctrl position」を展開
- 「Swap Ctrl and Caps Lock」を選択
設定は即時反映され、再ログインしても保持される。
方法2: gsettingsコマンド(CLI / Wayland対応)
Tweaksを入れたくない場合や、dotfilesで管理したい場合は
gsettings を直接叩く。Waylandでもそのまま効く。
現状確認:
1 | $ gsettings get org.gnome.desktop.input-sources xkb-options |
入れ替え:
1 | $ gsettings set org.gnome.desktop.input-sources xkb-options "['ctrl:swapcaps']" |
代表的なオプション:
| オプション | 動作 |
|---|---|
ctrl:swapcaps |
Caps LockとCtrlを入れ替え |
ctrl:nocaps |
Caps LockをCtrlに置き換え(Caps Lockは使えなくなる) |
caps:ctrl_modifier |
Caps Lockを「もう一つのCtrl」として扱う(Caps Lockも残る) |
元に戻す:
1 | $ gsettings reset org.gnome.desktop.input-sources xkb-options |
なお、gsettings
の値はGNOMEセッションに対する設定なので、コンソール(TTY)には効かない。コンソールでも入れ替えたい場合は
/etc/default/keyboard の XKBOPTIONS に
ctrl:swapcaps
を追加し、sudo dpkg-reconfigure keyboard-configuration
を実行する。
方法3(補足): keyd によるカーネルレベルの入れ替え
GNOMEに依存せず、ログイン画面・コンソール・任意のWaylandコンポジタで一様に動かしたい場合は
keyd
を使う。evdev / uinput
を経由してカーネルレベルでリマップするため、X11/Waylandを問わず動作する。
1 | $ sudo apt install keyd |
/etc/keyd/default.conf を以下のように作成する。
1 | [ids] |
設定を反映:
1 | $ sudo keyd reload |
「Caps Lockをホールド時はCtrl、タップ時はEsc」のような複合動作が欲しい場合もkeydで書ける(Vim使いには定番)。
Ctrl + Space で日本語/英語切り替え
Ubuntu 26.04 では IME フレームワークとして IBus(従来のデフォルト)と fcitx5(近年推奨されつつある)の二択になる。WaylandやAnki等のElectronアプリとの相性ではfcitx5の方が安定しているケースが多い。
どちらを使うかで設定箇所が変わるので、それぞれ書く。
注意: Super + Space との競合
GNOME 50のシステム既定は Super + Space
で入力ソースを切り替える挙動。Ctrl + Space を IME
側に割り当てる場合、システム側のショートカットを変更する必要はないが、Ctrl
+ Space を別アプリ(Emacs の
set-mark-command、tmuxのprefix等)で使っている場合は競合するため要注意。
パターンA: IBus + Mozc の場合
Ubuntu の伝統的な構成。IBus の「入力ソースの切り替え」ではなく、Mozc側のキー設定でトグルを定義するのが素直。理由は、IBusのレイヤだと「直接入力 → Mozc」の片方向しか拾わないことがあり、トグルとして機能させるには Mozc 内のモード遷移を直接書く必要があるため。
- 画面右上の入力ソースアイコンをクリック → 「ツール」 → 「プロパティ」を開く
- 「キー設定」の項目で「キー設定の選択」を「カスタム」にし、「編集」をクリック
- キーマップエディタで「編集」 → 「エントリーを追加」を選び、以下の2エントリを追加する
| モード | キー | コマンド |
|---|---|---|
| 直接入力 | Ctrl + Space | IMEを有効化 |
| 入力文字なし | Ctrl + Space | IMEを無効化 |
ポイントは、IMEを有効化する側のモードを「入力なし」ではなく「直接入力」にすること(先に紹介した UbuntuでJISとUSの両キーボードを使う の記事と同じパターン)。
合わせて、デフォルトで Ctrl + Space に「全角スペースを挿入」が割り当てられているエントリがある場合は削除しておく。重複していると意図しない挙動になる。
設定後はログアウト/ログインで反映。反映が怪しい時は以下で再起動できる。
1 | $ ibus-daemon -drx |
パターンB: fcitx5 + Mozc の場合
fcitx5 はそもそも デフォルトのトリガキーが Ctrl + Space だが、Ubuntu 26 + GNOME 50(Wayland)の組み合わせでは「インストールしただけでは動かない」要素が複数ある。順に潰す必要がある。
B-1. パッケージのインストール(フロントエンド込み)
1 | $ sudo apt install fcitx5 fcitx5-mozc fcitx5-config-qt \ |
フロントエンドパッケージ(gtk3/4, qt5/6)を入れ忘れると、fcitx5は起動するけれど対象アプリで Ctrl + Space を押しても無反応、という症状になる。最初は環境変数だけ確認しがちだが、フロントエンドが無いとそもそもアプリ側にIMモジュールが注入されない。
B-2.
~/.config/fcitx5/profile に keyboard-us と
mozc を並べる
これが特に分かりにくい。fcitx5のトリガキーは「IMをon/off」ではなく「グループ内の入力メソッドをトグル」。グループに
mozc しか居ないと、Ctrl + Space
を押しても見かけ上の挙動が「mozc ⇄
inactive」となり、英語直接入力には戻らないか、fcitx5自体がオフになって入力レイアウト依存になる。
profile の最小例(USキーボード):
1 | [Groups/0] |
JISキーボードなら keyboard-us を
keyboard-jp、Default Layout=us を
Default Layout=jp に変える。
GUIで入れたい場合は fcitx5-configtool を起動 →
左の「Input Method」タブで Keyboard - English (US) と
Mozc を この順で リストに登録する。
B-3.
~/.config/fcitx5/config の TriggerKeys は
サブセクション形式 で書く
地味だが重大なハマり所。以下は動かない書き方:
1 | # NG: TriggerKeys と 0= が同じ [Hotkey] セクション内 |
正しい書き方は、Hotkey/TriggerKeys
という独立したサブセクション:
1 | [Hotkey/TriggerKeys] |
前者はfcitx5に「TriggerKeysが空のリスト」と解釈され、Ctrl + Space
を押しても沈黙する。設定後は fcitx5 -r
で再起動。
B-4. fcitx5の自動起動を仕込む
Ubuntu 26 + GNOME 50 では、im-config -n fcitx5 だけでは
fcitx5
デーモンはログイン時に起動しない。/etc/xdg/autostart/
にfcitx5のdesktopファイルが配られるパッケージ構成にもなっていないので、自分で入れる:
1 | $ mkdir -p ~/.config/autostart |
B-5. 既存の ibus 系 autostart をユーザ側でマスクする
これも踏みやすい罠。apt purge ibus-mozc
をしていない場合、/etc/xdg/autostart/ には
ibus-mozc-gnome-initial-setup.desktop や
ibus-mozc-launch-xwayland.desktop
などが残り、毎回ログイン時に ibus-daemon
が起動する。fcitx5と並走して、フォーカスや起動順次第でキー入力を奪い合う。
ユーザ側の ~/.config/autostart/
に同名ファイルを置けば、システム側はシャドウされる。
1 | $ for f in /etc/xdg/autostart/ibus-*.desktop; do |
B-6. GNOME側の入力ソース切替ショートカットを潰す
Ubuntu 26のGNOMEは入力ソースをデフォルトで Super + Space
に割り当てているが、設定経路によっては Ctrl + Space
も拾うことがある。さらに
org.gnome.desktop.input-sources sources
に複数登録があると、GNOME自体がキー入力を横取りしてfcitx5に届かなくなる。
1 | # 入力ソースを単一に固定(fcitx5に任せる) |
B-7. 反映と確認
ここまでやってログアウト/再ログイン(または再起動)。確認:
1 | $ env | grep -E 'IM_MODULE|XMODIFIERS' # fcitx を指しているか |
もし端末で env に出ないが gnome-shell
本体には入っている、というケースもある。これはGUIアプリには効いている状態なので、入力テスト本体(テキストエディタで
Ctrl + Space)が成功するならOK。
動作確認
テキストエディタや端末で Ctrl + Space
を叩き、画面右上のIMEインジケータが「あ」と「A」(または相当の表示)で切り替わるかを確認する。切り替わらない場合は、以下を順に確認する。
- システムショートカット(
Settings → Keyboard → View and Customize Shortcuts)でCtrl+Spaceに別の機能が割り当たっていないか(B-6) - Mozc側のキー設定が
直接入力と入力文字なしの両方に入っているか(IBusの場合) - fcitx5の場合は
fcitx5-diagnoseを実行して環境変数(GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS)がfcitxを指しているか - fcitx5の
~/.config/fcitx5/configの TriggerKeys がサブセクション形式で書かれているか(B-3) - fcitx5の
~/.config/fcitx5/profileにkeyboard-*とmozcの両方が登録されているか(B-2)
Ansibleで自動化する
複数台に同じ設定を繰り返し入れる場合は、手元のAnsibleコレクション [ansible-miscs] に2つのroleと1つのplaybookを追加した。
追加したrole
roles/keyboard_swapcaps_gnome
CapsとCtrlの入れ替えをUbuntu desktop(GNOME 50 / Wayland)と仮想コンソールの両方に適用する。系統が2層あるため両方を面倒見るのが要点。
- GUIセッション側:
/etc/dconf/db/local.d/00-keyboard-swapcapsをテンプレートで配置し、dconf updateでシステム全体のGNOMEデフォルトとして反映。ユーザは次回ログイン時から有効 - コンソール側:
/etc/default/keyboardのXKBOPTIONSにctrl:swapcapsを入れ、setupcon --forceを発火
keyboard_swapcaps_xkb_option を ctrl:nocaps
や caps:ctrl_modifier に切り替えれば挙動を変えられる。
gsettings set ...
をユーザDBus越しに叩く方式は、SSH越しのAnsible実行ではセッションが取れないので意図的に避けた(dconfシステムoverrideなら無人で確実に効く)。
roles/fcitx5_mozc
fcitx5 + fcitx5-mozc
一式を入れて、~/.config/fcitx5/config
をテンプレートで上書きし Control+space
をトリガキーに固定する。im-config -n fcitx5
をユーザコンテキストで実行し、/etc/environment に
GTK_IM_MODULE=fcitx などを書き込む。
既存IM環境との競合に対する安全弁
Ubuntu標準は伝統的にIBus + ibus-mozcで、ユーザがすでに辞書登録やキーマップカスタマイズをしている可能性が高い。雑にfcitx5に上書きすると ユーザのIBus側Mozcデータが孤児になる ため、role冒頭で以下を検出する。
im-config -m(現在の選択)dpkg -lで既存IMフレームワークの一覧pgrep -x ibus-daemon
別系統のIMが検出されたら assert
で失敗させる。明示的に
-e fcitx5_mozc_force_switch=true
を渡したときだけ進む。-e fcitx5_mozc_purge_ibus_mozc=true
を併用するとibus側Mozcもpurgeされる(データ喪失を伴うので別フラグに分離)。
追加したplaybook
playbooks/conf/linux/ubu26_desktop.yml:
1 | - hosts: "{{ server | default('localhost') }}" |
実行例:
1 | $ cd ~/Sources/ansible-miscs |
事前検出だけ走らせたい場合(実機を変更しない):
1 | $ ansible-playbook -i hosts playbooks/conf/linux/ubu26_desktop.yml \ |
既存roleとの整理
| Role | 用途 | 採用すべきケース |
|---|---|---|
keyboard_nocaps(既存) |
/usr/share/X11/xkb/symbols/{jp,us}
を直接編集してCaps→Ctrl片方向 |
Raspberry Pi OSなどX11時代の構成。dist-upgradeで戻る点は注意 |
keyboard_swapcaps_gnome(新規) |
dconf override + /etc/default/keyboard
でCaps↔︎Ctrl入れ替え |
Ubuntu 26.04などGNOME/Wayland desktop |
japanese(既存) |
locale設定 + fcitx4 + fcitx-mozc + WSL用GTKスケール | WSL上で日本語が要るケース |
fcitx5_mozc(新規) |
fcitx5 + fcitx5-mozc + Ctrl+Spaceトリガ + 既存IM検出 | Ubuntu 26.04 desktopのIME |
ロールバック
うまく動かなかった場合や、元の構成に戻したい場合の手順。手で当てた設定とAnsibleで当てた設定で復旧の経路が違うので、それぞれ書く。
Caps↔︎Ctrl入れ替えを戻す
方法1(GNOME Tweaks)で当てた場合
GNOME Tweaks の
Keyboard → Additional Layout Options → Ctrl position で
Default に戻す。
方法2(gsettings)で当てた場合
1 | $ gsettings reset org.gnome.desktop.input-sources xkb-options |
方法3(keyd)で当てた場合
1 | $ sudo systemctl disable --now keyd |
サービスを残したまま個別マシンで一時無効化したいだけなら
disable --now のみで十分。
Ansibleで当てた場合(keyboard_swapcaps_gnome
role)
dconfシステムoverrideと /etc/default/keyboard
の両方を戻す必要がある。
1 | # GUIセッション側(dconfシステムoverride) |
各ユーザがログイン中の場合、GNOMEセッションには即時反映されない。一度ログアウト/ログインする。なお、ユーザ側で個別に
gsettings set ... xkb-options "['ctrl:swapcaps']"
を後から叩いている場合はそちらが優先されるので、gsettings reset
も併せて実行する。
IME(Ctrl+Space切替)を戻す
IBus + Mozc を変更した場合
Mozcのプロパティ → キー設定 → 「カスタム」のエントリから、追加した
Ctrl + Space
の2エントリ(直接入力時:IMEを有効化/入力文字なし時:IMEを無効化)を削除する。デフォルトの「全角スペース挿入」を消していた場合は元に戻す。
設定後:
1 | $ ibus-daemon -drx |
fcitx5 を変更した場合
~/.config/fcitx5/config の
[Hotkey/TriggerKeys]
を編集して元に戻すか、ファイル自体を消して再起動するとfcitx5デフォルト(Ctrl+Space)に戻る。
1 | $ rm ~/.config/fcitx5/config |
IBusに完全に戻したい(fcitx5を入れた後)
1 | $ im-config -n ibus |
Ansibleで当てた場合(fcitx5_mozc
role)
/etc/environment
への追記をブロックマーカーで囲んでいるので、マーカーごと削除する。
1 | # /etc/environment に追記したIM環境変数を削除 |
fcitx5_mozc_purge_ibus_mozc=true で
ibus-mozc
をpurgeしていた場合、ユーザの個人辞書(~/.config/mozc/
以下)はパッケージ削除では消えていないので、再インストール後にそのまま使える。ただしibus-mozcとfcitx5-mozcで個人辞書のパスは共有なので、移行時にデータ重複や上書きが起きていないかは要確認。
まとめてロールバックしたい場合
Ansibleでまとめて当てた構成を一気に戻すワンライナー的な手順は用意していない(破壊的すぎるため)。上記の「Caps↔︎Ctrl」と「IME」を順に手で実行する。安全に戻したい場合は、playbook適用前に該当設定ファイルのバックアップを取っておくのが確実。
1 | $ sudo tar czf ~/keyboard_backup_$(date +%F).tgz \ |
参考
- Ubuntu 26.04 LTS release notes
- Swap
control and caps lock on Wayland Ubuntu
23.04(
gsettingsの手順。Ubuntu 26でも同様に動く) - Remap your Caps Lock key on Linux | Opensource.com
- How I use keyd to remap my keyboard in Ubuntu 22.04 with Wayland
- Toggling between Japanese input modes in Ubuntu with a non-Japanese keyboard(Mozcキーマップの編集手順)
- Fcitx5 - ArchWiki
- UbuntuでJISとUSの両キーボードを使う(過去記事)
- Raspberry Pi OSでCapslockをCTRLにする(過去記事、X11時代の手法との比較に)