と。

Github: https://github.com/8-u8

Ubuntu LTS 20.14で英字キーボードと日本語キーボードを共存させる話

買っちった

肩こり解消のために買ってしまいました。

archisite.co.jp

早速PCにつないで光らせて遊ぶ図。

今回はタイトルの通りUbuntuでキーボード配置を別個に割り当てた奮闘記です。

結論からいうと敗北しており、今は「不便じゃないからこうすっか」な策を講じています。

【お悩み】日本語入力がデフォルトだと英字キーボードの配列で記号が打てない

日本で仕事をしている以上、日本語が書けないと意味がないんですが、
英字キーボードの配列は邪魔なものがなくてそのまま使いたいなあと思っています。

いつもはThinkpadのUSBキーボードを使っていて、トラックポイントを考えるともうしばらく使うだろうと考えると、
必然的に「英字キーボードと日本語キーボード双方の入力配列を維持して、日本語でも英語でも打てるようにしたい」
という問題に至ります。

要は「英字キーボードで日本語を打つときも、印字に対応する形で記号が打てるようにしたい」わけです。

プログラマなら当たり前の欲求だと思ったのでググったら案の定ヒットしたわけで。

unpush.hatenadiary.org

qiita.com

10年も前のブログ記事が出てくるってことはもう人類不偏の問題ということでいいね?

【解決策】xinputsetxkbmap で設定をする

詳細は上記2記事をみればだいたい分かると思うんですが、
Ubuntu(というかLinux)にはそれ用のコマンドxinputsetxkbmapがあって、
それらを使うことで「ログオンしている間」は実現するようでした。

具体的には、まずxinputをつかって英字キーボードの情報を抜き出して、
setxkbmap -device {deviceid} -layout us
を実行すれば解決するわけです。

【お悩み②】起動時に常に設定が反映されていて欲しい

きぬいとはラップトップにUSBでキーボードをつないでいて、
出かける時は全部外して持っていきます。
帰宅してUSBをつなぎ直すと、xinputで得られる英字キーボードに割り振られたIDが変わっていることが多々あります*1
また、再起動すれば上記の解決策での実行はリセットされるので、
どうにかして常時同じキー配置になるように設定をしたい。

【解決策②】シェルを書け

大体ググれば結果が出る時代、こんな解決策がバンバンと。

superuser.com

askubuntu.com

要は【解決策】で示したことを抽象化してshellで書けばいいじゃんという話。それはそう。
askubuntuのシェルをコピペしてきぬいとの環境用にリファクタリングしてデバッグしてとりあえず完成した。

#!/bin/bash
usbkbd=`xinput -list | {grepで英字キーボードの情報を抜き出す}"`
# echo $usbkbd
for i in `seq 1 $usbkbd`
  do
    usbkbd_ids=`xinput -list | {grepで必要な情報を抜き出す}| awk -F'=' '{print $2}' | cut -c 1-2 `
    # echo $usbkbd_ids
    usbkbd_layout="us"
    for ID in $usbkbd_ids
      do
        setxkbmap -device "${ID}" -layout "${usbkbd_layout}"
      done
  done
# fi
exit 0

あとはこれを起動時に実行してくれればいいなと思って以下を参照しながら/etc/profile.dに上のshファイルを配置して再起動しました。

yng.hatenablog.jp

そしたらログイン時に無限ループして詰みました。

原因は明らかに上のshファイルが間違いなく何か悪さをしているのですが、
とりあえず仮想コンソールを開いて/etc/profile.d/上から自作シェルを削除してことなきを得ました。

blog.mktia.com

結局どしたの

よくよく考えると、仕事でもUSBハブでスイッチして同じキーボードを使うので
「起動時に設定してもその切り替えでリセットされてしまう」という問題が残ります。
結局何らかの方法で設定してあげるのが良さそうだなあと思いながらターミナルを開いた時に思ったのが
「ターミナルの起動タイミングで制御すれば解決では?」ということでした。

きぬいとはzshを使っているので、~/.zshrcに上のシェルの実行と、
ターミナルの再起動のaliasrefreshという名前でwrapして、
以下を参考にターミナルを起動時に表示するようにしました。。

qiita.com

これで、仕事用PCから入力を切り替えたときも、ターミナルを開くか、すでに開いているターミナルを再起動するだけで、
とりあえずキー配置を住み分けることができるようになったということです。めでたしめでたし*2

負け要素

なんか/etc/rc.localとかに書けばいいみたいな話があったりして、
試してみたんですが上手く行かなかったなど、結構上手くいかないパターンが多くありました。
正直ターミナル依存であることは、頻繁にUSBキーボードを切り替え・抜き差しする勢には多少便利ではあると思いつつ、
起動時に「勝手にそうなっている」という状態を作れるとかっこいいですし、
切り替え・抜き差しをしたときに「勝手に切り替えてくれる」ようになってくれるといいなあと思ってはいます。
これをやるには多分デーモンを書かないといけないんですが、デーモンを書くやる気が出んもんで……
どうせターミナルは開くので不便ではないし、デーモン書く気が起きたらまたこの続きをかければなと思います。

*1:分からなくもないがなんか統一してくれな気持ちもある

*2:そもそもAlt+Ctrl+Tでターミナルが開くので、正直そこまで面倒ではない