NYAGOS保守ノート: 欧州向けキーボード対応ふたたび(AltGR キー処理)

日本では馴染みがないのだが、ヨーロッパのキーボードには AltGR というキーがあるようだ。用途としては、英語圏にない文字等を入力する時にシフト的に用いるようだ。

それが入力できなくなったという issue を起案いただいた。

AltGR 対応は、以前、一度行ったのだが、当時は一文字キー入力は自前(zetamatta/go-getch)でやっていた。

nyagos 4.4 で Linux 対応をするにあたって、mattn/go-tty に切り替えたのだが、本件についてはその際対応漏れとなっていたようだ。(いや、実はうすうす気付いてはいたのだが、テスト協力者がいなくてな)

さて、go-tty の場合、どうやればいいだろうか。 というか、キーボードそのものがないのに、どうやって動作確認をとれば?

報告者に確認してみたところ、AltGR + 6 を押下すると本来はパイプライン記号(|)が入力されるべきところが、^[| (ESCAPE + | )がデータとしてきてしまっている。つまり、単に ESCAPE が多いだけではないか。

で、実際、go-tty のコードを拝見すると、Ctrlキーと Altキーを同時押しした時、ESCAPE + その文字の Unicode を返すような動作となっている。 報告者のリポートを見ると、「CTRL+ALT+6」でも同じ結果になったと言っている。 OS的には AltGR キーは Ctrl+Alt 同時押しと同じ扱いになっており、go-tty もちゃんと対応していると見てよいだろう。

よって、対応としては、ESCAPE + 1文字が来た時は、ESCAPE をカットすればよさそうである。 ただ、そうすると、他の ESCAPE 文字で表現される特殊キーのアサインに支障が発生する。 そこで未アサインのキーが来た場合、つまり、そのキーの内容をそのまま一行入力バッファに格納する場合のみ、先頭にある ESCAPE をカットするという風に対応した。

これでコミットして、AppVeyor のバイナリを報告者に使ってみていただいたところ Ok がもらえた。バッチリである。