0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu + Apple フルキーボードにおいて、udev + xremap + xdotool で「テンキーのカンマ」を入力できるようにする

Last updated at Posted at 2024-08-15

やりたいこと

Ubuntu 22.04でAppleの日本語フルキーボードを使っている(Ubuntu 24.04についてはこちら)。

apple_fullkeyboard_jp.png

Ubuntuを普通にインストールした状態では、このキーボードで、テンキーの「カンマ」を打鍵しても、「ピリオド(ドット)」を入力してしまう。

テンキーのカンマを打鍵したら、テンキーのカンマとして入力できるようにしたい。

Appleの日本語フルキーボードのテンキー部分。最下段左から2つめがカンマキー

まず別解

このページの方法よりも、「Ubuntu + Apple フルキーボードにおいて、xmodmap で「テンキーのカンマ」を入力できるようにする」のほうが、打鍵と入力とのタイムラグが少なくて気持ちが良い。

ただ、このページに書いてある方法自体は、xremapやxdotoolの典型的なサンプルでもあるのでこのまま残します。

解法

X11前提

Waylandでは、xdotoolが動かないため、X11が前提です。

udevを設定する

sudo vi /etc/udev/hwdb.d/10-mykeyboard.hwdb

として、以下を入力して保存(Apple Magic Keyboardの場合はp022p026)。

/etc/udev/hwdb.d/10-mykeyboard.hwdb
evdev:input:b0003v05**p022*
 KEYBOARD_KEY_70085=scrolllock

以下で反映する。

sudo systemd-hwdb update && sudo udevadm trigger

xdotoolを用意する

いったんインストールだけでいい。

sudo apt install xdotool

xremapを用意する

以下手順で準備。

sudo apt install curl
curl https://sh.rustup.rs -sSf | sh
sudo apt install cargo
cargo install xremap --features x11

下準備(xremapをsudoで起動しない設定)をする(YOURUSERNAMEは置き換える)。

sudo gpasswd -a YOURUSERNAME input

以下を実行。

echo 'KERNEL=="uinput", GROUP="input", TAG+="uaccess"' | sudo tee /etc/udev/rules.d/input.rules

ここまでやったらrebootする(もしX11にしてなかったら、このrebootのときに、起動画面でX11に切り替える)。

~/.xremap/config.ymlを作って、

cd && mkdir .xremap && cd ~/.xremap && vi config.yml

以下内容を入れる。

~/.xremap/config.yml
keymap:
  - name: Global
    remap:
      scrolllock: {launch: ['xdotool', 'key', 'KP_Separator']}

config.ymlを保存したら、以下で動作確認する。

~/.cargo/bin/xremap ~/.xremap/config.yml

エディタなどで、テンキーの「カンマ」打鍵でカンマが入ることを確認する。NUMLOCKキーを忘れないようにすること。

自動起動を設定する

常に有効にさせるために、サービスを作成する。ディレクトリがない場合はあらかじめ作る。

cd ~/.config/ && mkdir -p systemd/user && sudo vi ~/.config/systemd/user/xremap.service

以下の内容にする(YOURUSERNAMEは置き換える。フルパス必須なので、~は使えない)。

~/.config/systemd/user/xremap.service
[Unit]
Description=xremap

[Service]
KillMode=process
ExecStart=/home/YOURUSERNAME/.cargo/bin/xremap /home/YOURUSERNAME/.xremap/config.yml
ExecStop=/usr/bin/killall xremap
Restart=always

[Install]
WantedBy=default.target

デーモン登録をする。

systemctl --user daemon-reload

xremapを開始する。

systemctl --user start xremap

自動起動を設定する。

systemctl --user enable xremap

再起動して、うまく行くか確認する。

参考リンク

  • xremap/xremap: Key remapper for X11 and Wayland: Linuxのキーボードリマッパーであるxremapのページ。かなり丁寧に使い方が説明されているので、よく読む必要がある。場合によるとissueも役に立つ
  • xremapをsystemctlで自動起動するメモ: ぼくはWantedByでハマったのだけど、ここに書いてある情報のおかげで解決できました
  • Ubuntu でキーマップの変更: Linuxのデバイス管理の仕組みであるudevの使い方が丁寧に説明されている。上記「解法」ではデバイスの判定を大きく端折っているが、うまく行かない場合は、このページでデバイスの指定の仕方を理解する必要がある
  • xdotool コマンド全26実例: インストールからコマンド事例まで読める

Ubuntu 24.04の場合

結論的にはここに書いてあるとおりの同様の設定で、テンキーのカンマを入力できる。しかし、どうにも収まりの悪い解決になっている。

サービスの自動起動の不具合

ぼくの環境では、Ubuntu 24.04では、すなおに自動起動しない。起動直後はテンキーのカンマがなんの反応もしない。xevでも無反応。

でも、あらためてsystemctl --user restart xremapしたら、テンキーのカンマが入力できるようになる。当然ながらxevも反応するようになる。

サービスがきちんと登録されていないのか、とsystemctl --user status xremapで確認してみても問題はない。

しかし、xremapで設定をした「何か」を使うと、とたんにテンキーのカンマが使えるようになり、xevの反応も復活する。具体的には、以下の設定。

~/.xremap/config.yml
  # Global
  - name: Global Modmap for Apple Aluminium
    device:
      not: 'AT Translated Set 2 keyboard'
    remap:
      capslock: Ctrl_L
      Super_L: Ctrl_L
      Super_R: Ctrl_L
      Ctrl_L: Super_L

keymap:
  # Global
  - name: Global
    remap:
      hanja: muhenkan
      hangeul: henkan
      scrolllock: {launch: ['xdotool', 'key', 'KP_Separator']}
この設定について
  • commandキー(superキー)を、controlキーにしている。
  • superキーをcontrolキーとして使うために、gnome-tweaksで、「アクティビティ」は「右Super」に変更し、「設定」でSuperキーの絡むキーボードショートカットはすべて無効化している。
  • Aの横にあるcontrolキーは、superキーにして、いろいろな機能をあてている。

実際は、以下を入れている。

~/.xremap/config.yml
# Terminalでxremapを有効にするのに必要なディレイ
# X270では必要だが、macbookでは不要だった
#keypress_delay_ms: 20

# モディファイアキー設定
modmap:
  # Windowsキーボード用設定(ここから)
  # Emacs以外
  # - SuperをCtrlに、Caps LockをSuperに
  - name: Modmap of Except for Emacs
    device:
      only: 'AT Translated Set 2 keyboard'
    application:
      not: Emacs
    remap:
      Super_L: Ctrl_L
      Super_R: Ctrl_L
      capslock: Super_L

  # Emacsのみ
  # - CtrlとSuperを入れ替え、Caps LockをCtrlに
  - name: Modmap of Emacs
    device:
      only: 'AT Translated Set 2 keyboard'
    application:
      only: Emacs
    remap:
      Ctrl_L: Super_L
      Super_L: Ctrl_L
      capslock: Ctrl_L
  # Windowsキーボード用設定(ここまで)

  # Apple Aluminium キーボード用設定(ここから)
  # Global
  # - CtrlとSuperを入れ替え、Caps LockをCtrlに
  - name: Global Modmap for Apple Aluminium
    device:
      not: 'AT Translated Set 2 keyboard'
    remap:
      capslock: Ctrl_L
      Super_L: Ctrl_L
      Super_R: Ctrl_L
      Ctrl_L: Super_L
  # Apple Aluminium キーボード用設定(ここまで)

keymap:
  # Terminal
  - name: replace stop and copy for Terminal
    application:
#      only: gnome-terminal-server # wayland
      only: Gnome-terminal # X11
    remap:
      Ctrl-c: Ctrl-Shift-c # copy
      Super-c: Ctrl-c # stop

  # Emacs以外
  - name: not for Emacs
    application:
      not: Emacs
    remap:
      Super-a: home # line start
      Super-e: end # line end
      Super-k: Ctrl-k # to katakana at Mozc
      Super-j: Ctrl-j # to hiragana at Mozc
      Ctrl-up: Ctrl-home # document top
      Ctrl-down: Ctrl-end # document bottom
      Super-up: Ctrl-up # for Excel and Google Spreadsheet
      Super-down: Ctrl-down # for Excel and Google Spreadsheet
      shift-ctrl-h: alt-home # browser home
      alt-ctrl-left: ctrl-pageup # browser previous tab
      alt-ctrl-right: ctrl-pagedown # browser next tab

  # Thunderbird, Terminal以外
  - name: not for Thunderbird and Terminal
    application:
      not: [thunderbird-esr, Gnome-terminal]
    remap:
      Shift-Ctrl-w: {launch: ['xdotool', 'getactivewindow', 'windowsize', '1280', '980', 'windowmove', '2200', '0']}

  # Terminal
  - name: for Terminal
    application:
      only: Gnome-terminal
    remap:
      Shift-Ctrl-w: {launch: ['xdotool', 'getactivewindow', 'windowsize', '1000', '800', 'windowmove', '1900', '0']}

  # Thunderbird
  - name: for thunderbird
    application:
      only: thunderbird-esr
    remap:
      Super-Ctrl-w: {launch: ['xdotool', 'getactivewindow', 'windowsize', '1000', '1100', 'windowmove', '400', '-20']}
#      Super-Ctrl-w: {launch: ['xdotool', 'getactivewindow', 'windowsize', '1000', '1100', 'windowmove', '0', '-20']}
      Shift-Ctrl-w: {launch: ['xdotool', 'getactivewindow', 'windowsize', '800', '700', 'windowmove', '1200', '200']}
      Super-r: [alt-v,v,v,v,v,v,v,v,v,v,v,f,c] # 実験中
#      Super-r: {launch: ["bash", "-c", "xdotool key alt+v"]}
#      Super-r: alt-v

  # Global
  - name: Global
    remap:
      ctrl-f1:
        # launch word register
        launch: ["/usr/lib/mozc/mozc_tool", "--mode=word_register_dialog"]
      ctrl-f2:
        # launch screen shot
        launch: ["gnome-screenshot", "-i"]
      # Global for Apple Aluminium
      # - 「hanja」「hangeul」は他のキーボードにないキーなので、影響がないものとしてGlobalに入れる
      hanja: muhenkan
      hangeul: henkan
      scrolllock: {launch: ['xdotool', 'key', 'KP_Separator']}

この設定の絡んだ操作——たとえばコピーアンドペーストやTerminalでの^C——をすると、テンキーのカンマが入力できるようになる。xevも反応するようになる。

Ubuntu 24.04のインストールを3回ほどやって、まっさらな状態で試しており、毎回再現するのだけど、じゃっかん気持ちが悪い状態。xremapのissueにもこの手がかりがないっぽい。

再起動のたびにsystemctl --user restart xremapしろとなると、やってられない、となるのだけど、「コピーアンドペーストしたら動くようになる」だったら、あんまり問題もないところが、悩ましい。

この件に関しては、いったんオープンエンドで。

解決までの試行錯誤について

以下、だらだらと試行錯誤を記録しているだけです。

Apple フルキーボード(Apple Magic Keyboard (日本語)も有線キーボードも)のテンキーのカンマキーは、Ubuntuを普通にインストールした状態だと、押下した際、「.(ピリオド/ドット)」を入力する。

sudo dpkg-reconfigure keyboard-configuration

でキーボードを変更したらなおるかと思い、Apple Aluminium (JIS)を選んでみるものの、うまくいかない。

あらためて、このテンキーのカンマキーを

sudo evtest

で確認すると、KPCOMMAという信号を送っていることを確認できる。

Apple Aluminium (JIS)のテンキーのカンマ (デフォルト)についてのevtestの出力
Event: time 1722137343.613318, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70085
Event: time 1722137343.613318, type 1 (EV_KEY), code 121 (KEY_KPCOMMA), value 0

しかし、xremapxev)ではこのカンマを認識できない。このカンマキーもその隣のピリオドも両方KP_Decimalになってしまう。

テンキーのカンマ (xev抜粋)
state 0x10, keycode 129 (keysym 0xffae, KP_Decimal), same_screen YES,
テンキーのピリオド (xev抜粋)
state 0x10, keycode 91 (keysym 0xffae, KP_Decimal), same_screen YES,

もっともシンプルなのは、udevだけで解決できることで、その方法は、後述の「「設定」「キーボード」「入力ソース」で「日本語」を捨てる方針の場合」に残しておくが、何でも自由にできる代わりに茨の道が待っている。

udevだけの解決方法として、次のような手もある。

/etc/udev/hwdb.d/10-mykeyboard.hwdb
evdev:input:b0003v05**p022*
 KEYBOARD_KEY_70085=comma

この場合だと、いわゆる「普通のカンマ」が入力されるようになる。これでいいという人は、それでもいいかもしれない。しかし、Mozcの「設定」の「テンキーからの入力」「直接入力」の恩恵は受けられない。普通のカンマなので、日本語入力モードの際、テンキーのピリオドは直接入力のピリオドを入力してくれるのに、テンキーのカンマは全角の読点「、」を入力してしまう。フルキーボードをつかっている利点が、かなり減じてしまう。

そもそもこの「テンキーのカンマ」は、相当探してみたが、Appleの日本語キーボードにしかない。テンキーだけのキーボードですら、このカンマキーを実装している製品を見つけることが困難だった。

そういう事情からか、udevで使えるキーの語彙のなかでも、kpjpcommaという奇怪な名前が与えられている(hanguelや、henkanというキーはあるものの、ざっと俯瞰してみても地域名がキーの名前に含まれているのは稀)。

では、kpjpcommaをなんとか送信できればいいかというと、そんなにかんたんではなかった。

xremapや、udevで、kpjpcommaを送ると、何も出力しない。どうやら。kpjpcommaには、「テンキーのカンマ」という役割が与えられていない。

XKBを勉強してリベンジを試みる」によると、

InputEventCode evdevKeycode xmodmapKeycode
KEY_KPJPCOMMA 95 <JPCM> = 103; // KPJPComma keycode 103 =

となっており、たしかに

xmodmap -pke | grep 103

は、

keycode 103 =

を返してくる。~/.Xmodmapで、

keycode 103 = KP_Comma

としたが、これは

bad keysym name 'KP_Comma' in keysym list

となってしまう。KP_Commakpjpcommaも、どうもxmodmapの語彙ではない様子。

試行錯誤の結果、KP_Separatorが、テンキーのカンマを入力してくれることがわかった(ここまでが相当長かった)。しかし、では、xremapKP_Separatorを送ることができればいいのだが、あいにくとxremapの語彙の中にKP_Separatorがない。xremapの語彙の中でそれっぽいものは一通り試したのだけど、どうにも見つからない。

「それっぽいもの」の記録
kpdot ピリオドが出る
kpcomma ピリオドが出る
kpjpcomma 無反応

問題を整理するとこう。

  1. xremapはテンキーのカンマとピリオドを区別できない。udevはこれを区別できる
  2. テンキーのカンマの信号を送ってくれるのは、kpcommaでもkpjpcommaでもなく、KP_Separatorだが、udevは直接、KP_Separatorを送信できない(おそらく対応するものがない)
  3. udevで、テンキーのカンマをxremapが理解できるキー(普段使わないキー。ぼくはscrolllockにした)にする
  4. xremapKP_Separatorを送信できればいいが、xremapではKP_Separatorを送信できない(おそらく対応するものがない)
  5. xremapでは、xdotoolを起動できる。xdotoolであれば、KP_Separatorを送信できる

というわけで、その解法が、このドキュメントの先頭にあるものです。いかにも無理やりな解決ですので、もっとエレガントな方法があったら教えてください。

「設定」「キーボード」「入力ソース」で「日本語」を捨てる方針の場合

入力ソース」から「日本語」を捨てると、「日本語 (Mozc)」の「直接入力」に相当するものが、英語キーボード的なものに変わる。たとえば;を押下すると「:」が入力され、shift+;で「;」が入力される。

この状態だとudevでいじったとおりに何でも言うことを聞いてくれるので、以下設定が有効になる。

sudo vi /etc/udev/hwdb.d/10-mykeyboard.hwdb
/etc/udev/hwdb.d/10-mykeyboard.hwdb
evdev:input:b0003v05**p022*
 KEYBOARD_KEY_70085=kpjpcomma

とした後、以下で反映する。

sudo systemd-hwdb update && sudo udevadm trigger

設定」「キーボード」で「日本語」キーボードを削除(順番の入れ替えではなく削除)し、「日本語 (Mozc)」だけにしたのち、rebootしたら、kpjpcommaが入力できた。

しかし言い換えると、kpjpcommaが入力できるようになるだけ。英語キーボードを知ってたらどこに何があるかわかるとは思いますが、Appleの日本語キーボードとしては、ほとんど使い物にならなくなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?