RDPでリモート接続したUbuntuのマシンにJIS配列のHHKBを認識させる

追記1

sudo dpkg-reconfigure keyboard-configurationHappy Hackingを選択するように書いたけど、Happy Hackingの配列(というかUS配列)にはJIS配列における_\に対応するキーが存在しないので、Happy Hackingの代わりにMacの配列を選択するほうが良い気がしている(まだ試していない)。

モチベ

開発環境でWin -> Ubuntu20.04にrdpして作業する際にスペースキーの両サイドのかな/英数キーが反応していなかった。ので反応するようにしたかった。

キーワード

検索時に役立ったキーワード

  • hangul
  • hangul_Hanja

HHKB, jis, rdp, あたりだと良い結果が出ない。jis配列の時点で日本語圏に絞られるし、hhkbのハック記事を出すような人はjis配列を使っていない。hhkbのかな/英数にマップされているのがなぜかハングル(かつ反応しない)のでこれが決め手になった。

設定

  1. 端末に直接キーボードを挿して、sudo dpkg-reconfigure keyboard-configurationを実行する
    1. keyboard-configurationの設定画面が出る(※リモート接続だと出ない)
    2. Happy Hackingを選択
    3. 全部デフォルトの設定を選択
  2. 再起動してGUIの右上からキーボードマップを確認、HHKBになっていれば良い
    1. ※キーボードマップを設定しないと、xev使用時のキーマップがNosymbolになり後ろのフローに進めない(と思う)
  3. setxkbmap -queryでキーボード設定のrule, model, layoutなど出てきたものを全部メモする
  4. 端末からログアウトし、リモートデスクトップでログインする
    1. ※直接端末側で設定しても、リモートデスクトップ時にたいてい壊れる。直接端末を触ることは自分はあまりないので使い分けをせずリモートデスクトップ用の設定のみをすることにした
  5. setxkbmap -queryリモートデスクトップ上で確認する
    1. 直接端末を操作しているときと異なる場合は、異なる項目を確認しsetxkbmap -rules evdevなど、リモート接続時のパラメータを直接接続時のパラメータに合わせるように設定する
    2. 自分の環境ではrules -> evdev, model -> hhkに修正している
  6. かな/英数キーに何が割り振られているか確認する
    1. xevコマンドでキー番号とキーマップを調べる
    2. 手元のhhkbはキー番号が121/122、キーマップはHangul/Hangul_Hanjaに割り当てられていた
      1. ※直接接続時は130/131になっていたので、キーボードの種別は同じでもキー番号が接続法により異なることということはなんとなくわかった
    3. .Xmodmapファイルをホームディレクトリに作成し、キー番号と キーマップの対応を書く
      1. keycode 122 = Hiragana NoSymbol Hiraganakeycode 121 = Eisu_toggle NoSymbol Eisu_toggleを追記した
    4. (ほかにも矢印キーが無変換などにマップされていたので修正している)
    5. xmodmap ~/.Xmodmapで設定を読み込む
  7. xevでキーマップを確認する
    1. 英数/かなキーのキーマップがEisu_toggle/Hiraganaになっていれば良い
  8. iBus-mozcの設定でHiraganaIMEOn, EisuIMEOffにする
    1. https://qiita.com/rattcv/items/a8a07ec292ec898a1e9e#mozc%E3%81%AE%E8%A8%AD%E5%AE%9A
    2. これをと同じことをした
    3. (多分、fcitxでも同じことができると思う)
  9. 最後にGUI端末起動時にsetxkbmapの設定とXmodmapの設定を読み込むように.bashrcに数行追記する
# ~/.Xmodmapに追記したもの
keycode 122 = Hiragana NoSymbol Hiragana
keycode 121 = Eisu_toggle NoSymbol Eisu_toggle

# 矢印キーも狂っていたので直した
keycode 98 = Up NoSymbol Up
keycode 100 = Left NoSymbol Left
keycode 102 = Right NoSymbol Right
keycode 104 = Down NoSymbol Down
# .bashrcに追記したもの
if [ $XDG_SESSION_TYPE != tty ]; then
    setxkbmap -rules evdev
    setxkbmap -model hhk
    xmodmap ~/.Xmodmap
fi

下調べ

特に役立ったもの