Kitty キーボード プロトコルのサポート
一般に端末は、ASCIIなどの文字コードを受け取って動作する。このためキーボードは、ASCII文字コードなどを送信するようになっている。しかし、文字コードに変換されてしまうと、キャリッジリターンキーと「Ctrl+M」のどちらも0x0DというASCII制御文字になってしまい、キーストロークとしては区別できなくなってしまう。
同様にEscキーと「Ctrl+]」キーの組み合わせが区別できない。また、Windowsなどの一般アプリケーションで使う「Alt」キーを修飾キーとして、文字キーの組み合わせることもできない。これは、Altキーが単独キーとして扱われ、専用のエスケープシーケンスコードに変換されて送信されるからだ。
これでは、アプリケーション内で使うキーの組み合わせはコントロールキーと文字キーの組み合わせに限定されてしまい、それ以上のキーを使いたければ、Emacsのようにメタキーと文字キーのような2つのキーを順に押すような方法をとるしかない。
これを解決するため、プレビュー版では、ターミナルソフトウェアKitty由来の「Kittyキーボード・プロトコル」(https://sw.kovidgoyal.net/kitty/keyboard-protocol/#)を採用した。
Kittyキーボード・プロトコルは簡単に言えば、文字コードではなく、キーの押下・解放、リピート動作などを表現できるコードである。109キーボードが出力するスキャンコードのようなものだが、プラットフォームに依存しないように作られている。
アプリケーションは、Kittyキーボード・プロトコルでのキーイベント(キートップや押下、解放などのイベント情報)をエスケープシーケンスで要求し、エスケープシーケンスとしてキーイベントを受け取る。
Kittyキーボードプロトコルを使うとき、最初に「Esc [ < 1 u」を送る。以降、文字コードではなく、以下の形式のKitty キーボードプロトコルが送信されてくる。なおCSIは、「Esc [」を意味する。
CSI キーコード ":" Altキーコード ";" 修飾キー ":" イベント ";" コードポイント "u"
キーコードは押されたキーのファイナルキーを小文字で表現したもの。これに対してコードポイントは実際に使われたキーの文字コードを表す。「イベント」は、「なし」または「1」がキーの押下を、2が繰り返し(タイパマチック)を、3がキーの解放となっている。
修飾キーは、Shift、Ctrl、Alt、Metaなどの6つのキーとCapsLock、NumLockの2つの合計8つを8bit中の1bitで表現する。キーコードとして「[」(=91)、修飾キーにCtrlがあるなら、「Ctrl+i」が押されたことを意味する。
キーコードがEsc(=27)ならばEscキーが押されたと区別できる。
Windows ターミナルプレビュー版に搭載されたKittyキーボード・プロトコルは、他のターミナルプログラムやVimのようなエディタソフトウェア、キー関連のライブラリなどが対応している。独自機能の追加だけではなく、アプリの互換性や、公開仕様を取り込む姿勢は評価したい。

この連載の記事
-
第519回
PC
「セキュアブート」に「TPM」に「カーネルDMA保護」、Windowsのセキュリティを整理 -
第518回
PC
WindowsにおけるUAC(ユーザーアカウント制御)とは何? 設定は変えない方がいい? -
第517回
PC
Windows 11の付箋アプリはWindowsだけでなく、スマホなどとも共有できる -
第516回
PC
今年のWindows 11には26H2以外に「26H1」がある!? 新種のCPUでのAI対応の可能性 -
第515回
PC
そもそも1キロバイトって何バイトなの? -
第514回
PC
Windows用のPowerToysのいくつかの機能がコマンドラインで制御できるようになった -
第513回
PC
Gmailで外部メール受信不可に! サポートが終わるPOPってそもそも何? -
第512回
PC
WindowsのPowerShellにおけるワイルドカード -
第511回
PC
TFS/ReFS/FAT/FAT32/exFAT/UDF、Windows 11で扱えるファイルシステムを整理する -
第510回
PC
PowerShellの「共通パラメーター」を理解する - この連載の一覧へ













