概要
Raspberry Pi で 変換、無変換キーをCtrlキーに割り当てる(役割を変更する)の方についてです。
Ubuntu で 変換、無変換キーをCtrlキーに割り当てる のやり方の通りでは上手く行かなかったため、ChatGPTと試行錯誤して下記にたどり着きました。
なお、環境は Raspberry Pi 5、OSは Debian GNU/Linux 12 (bookworm) です。
カスタムシンボル定義を作成
まず XKB が読み込むシンボルファイルを用意します。
mkdir -p ~/.config/xkb/symbols cat > ~/.config/xkb/symbols/custom << 'EOF' partial modifier_keys xkb_symbols "henkan_ctrl" { // 変換キーを左Ctrlに key <HENK> { [ Control_L ] }; modifier_map Control { <HENK> }; }; partial modifier_keys xkb_symbols "muhenkan_ctrl" { // 無変換キーを右Ctrlに key <MUHE> { [ Control_R ] }; modifier_map Control { <MUHE> }; }; EOF
- ~/.config/xkb/symbols/custom に “custom:henkan_ctrl” と “custom:muhenkan_ctrl” というオプション名で使える定義を作成します。
カスタムオプションを登録
次に、この2つのオプションを XKB のルールに登録します。
mkdir -p ~/.config/xkb/rules cat > ~/.config/xkb/rules/evdev << 'EOF' ! option = symbols custom:henkan_ctrl = +custom(henkan_ctrl) custom:muhenkan_ctrl = +custom(muhenkan_ctrl) ! include %S/evdev EOF
- 先頭の2行で custom:… オプションを追加。
- 最後の ! include %S/evdev は標準の evdev ルールをそのまま読み込むためのものです。
Labwc の environment ファイルを編集
Labwc 起動時に自動で setxkbmap を叩くための設定を入れます。
私の環境では environment ファイルは作成されていたので XKB_DEFAULT_OPTIONS に追記しました。
cat >> ~/.config/labwc/environment << 'EOF' # XKB の基本設定 XKB_DEFAULT_MODEL=pc105 XKB_DEFAULT_LAYOUT=jp XKB_DEFAULT_VARIANT= # ここに先ほど作ったオプションをカンマ区切りで指定 XKB_DEFAULT_OPTIONS=custom:henkan_ctrl,custom:muhenkan_ctrl EOF
Labwc を再起動/再ログイン
設定が反映されるよう、一度ログアウト→ログインします。
Emacsの設定
上記までの設定により、Shell では期待する動作が実現できたのですが、Emacs 上ではできませんでした。
下記の設定を行うことで対応しました。
(defun raspberry-pi-p () "" (and (eq system-type 'gnu/linux) (file-readable-p "/proc/device-tree/model") (with-temp-buffer (insert-file-contents "/proc/device-tree/model") (goto-char (point-min)) (search-forward "Raspberry Pi" nil t))))
(when (raspberry-pi-p) (setq gnutls-algorithm-priority "NORMAL-VERS-TLS1.3") (when (display-graphic-p) (start-process "xkb" nil "setxkbmap" "-model" "pc105" "-layout" "jp" "-option" "custom:henkan_ctrl,custom:muhenkan_ctrl")) ;; — turn Henkan/Muhenkan (and their repeats) into Control modifiers, ;; but swallow the pure repeat events so they’re never dispatched — (define-key key-translation-map (kbd "<henkan>") 'event-apply-control-modifier) (define-key key-translation-map (kbd "C-<henkan>") #'ignore) (define-key key-translation-map (kbd "<muhenkan>") 'event-apply-control-modifier) (define-key key-translation-map (kbd "C-<muhenkan>") #'ignore) )