標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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 がもらえた。バッチリである。