質問: ssh の先に `C-.` に対して、自分で定義したコード(?)を送れる端末エミュレータがほしい の質問を作成する過程でわかったことなのですが、端末エミュレーターでは `C-.` をコードとして送付できませんでした。 継続して端末エミュレーター上の挙動を見ていたところ、今度は `Shift + 矢印` がただの`矢印`として対象 OS に送られている様子でした。 こういった、端末に関して出くわす問題(GUI版 emacs と比較して)は、おそらく「端末上で動かす emacs」を取り扱っている限りは、いくらでも発生するだろうな、と考えています。それだったら、その仕様がどうなっているかについての資料(規格?)をあたってから、個別の特異な動作について対処を行ったほうがいいかなと考えています。 質問: * 一般的な端末エミュレーターの動作について、その仕様を記述した資料などはありますでしょうか。
回答: 回答になっているかわかりませんが、VT100のシフトキー、コントロールキーの挙動がわかったのでおしらせします。 VT100テクニカルマニュアルの4-43 (PDFのページで93)に次のような記述を見つけました。昔のキーボードは縦横に張られたグリッドの交差点にあるスイッチのON/OFFをスキャンして、そこで得られたコードを使ってROMにある表を参照し、ASCIIに変換していたそうです。コントロールキーが押されている場合はさらに別の表を参照して、そのASCIIがコントロールとして有効であれば7bit ASCIIの上位2bitを0にして送信というわけでした。 !画像の説明をここに入力 もし有効性を確認するステップがなければ、次のASCII表を見ればわかる通り、Ctrl-NもCtrl-nもCtrl-.も同じコードを送信するはずです。ただそれだと混乱を招くのは明白なので、Ctrl-NとCtrl-nだけ有効にしたのでしょう。そしてどちらも同じSOを送信するはずです。 !画像の説明をここに入力 Unix端末に表示される一見ランダムに見える記号たち(^がエスケープとか^Mが改行とか)も7bitの上位2bitをマスクした結果だったわけで、根拠がはっきりしました。 このマニュアルには、この他にもPrint Screen, Scroll lock, Pause/Breakなど普段使うことのないキーの本来の目的が書かれていて興味深かったです。 **追加調査** emacsではCtrl-/でUndoができますが、同行のCtrl-Oは改行を挿入するコマンドです。区別ができるということは単にSIを送っているわけではないはず。このコマンドはVT100の時代から変わっていないと思うので、どのようなシーケンスを送っているのか調査しました。 **結果** この回答によるとCtrl-/はC0 and C1 control codesでは定義されていないそうです。VT100ではCtrl-/でUndoできなかったと思われます。先のマニュアルのAppendix 8 (PDF 300ページ)でもCtrl-/に言及はありません。VT102では利用可能です(後述)。 MacのiTerm2でLinuxにログインして`tty`とタイプし、現在のTTYを取得した後、`sudo cat /dev/pty/X`としてCtrl-/を入力すると^_と表示されたのでCtrl-_にマップされていることがわかりました。Ctrl-oは^Oでそのままでした。ちなみにCtrl-?はDELにマップされているようです。 Mac標準アプリのTerminalではCtrl-/は送出できませんでした。 emacsでCtrl-_とすればUndoできます。むしろこちらがどの環境でも動くという意味で一般的なキーストロークだそうですが101キーボードではシフトを押しながらなので使いづらいです。 **VT102** VT100エミュレータは実はVT102のエミュレータであることが多いとの記述があり、VT102について調べたところCtrl-/は037(16進数で1f)が割り当てられていました。よってiTerm2/xtermは独自仕様だったのではなくVT102のエミュレーションということで確定です。詳細はVT102のマニュアルをご覧ください。HTMLなので検索も簡単です。 ![画像の説明をここに入力