22022


[ssh の先に `C-.`
に対して、自分で定義したコード(?)を送れる端末エミュレータがほしい](https://ja.stackoverflow.com/q/21979/754)
の質問を作成する過程でわかったことなのですが、端末エミュレーターでは `C-.` をコードとして送付できませんでした。

継続して端末エミュレーター上の挙動を見ていたところ、今度は `Shift + 矢印` がただの`矢印`として対象 OS に送られている様子でした。

こういった、端末に関して出くわす問題(GUI版 emacs と比較して)は、おそらく「端末上で動かす
emacs」を取り扱っている限りは、いくらでも発生するだろうな、と考えています。それだったら、その仕様がどうなっているかについての資料(規格？)をあたってから、個別の特異な動作について対処を行ったほうがいいかなと考えています。

質問:

  * 一般的な端末エミュレーターの動作について、その仕様を記述した資料などはありますでしょうか。


CC BY-SA 3.0
2016-02-12T04:56:13.557
21995
2016-02-16T08:01:17.410
2017-04-13T12:52:38.920
-1
754
question
emacs 端末エミュレーター
一般的な「端末(エミュレーター)」の仕様は？


回答になっているかわかりませんが、VT100のシフトキー、コントロールキーの挙動がわかったのでおしらせします。

[VT100テクニカルマニュアル](http://vt100.net/docs/vt100-tm/ek-vt100-tm-002.pdf)の4-43
(PDFのページで93)に次のような記述を見つけました。昔のキーボードは縦横に張られたグリッドの交差点にあるスイッチのON/OFFをスキャンして、そこで得られたコードを使ってROMにある表を参照し、ASCIIに変換していたそうです。コントロールキーが押されている場合はさらに別の表を参照して、そのASCIIがコントロールとして有効であれば7bit
ASCIIの上位2bitを0にして送信というわけでした。

[![画像の説明をここに入力](https://i.stack.imgur.com/ekR01.png)](https://i.stack.imgur.com/ekR01.png)

もし有効性を確認するステップがなければ、次のASCII表を見ればわかる通り、Ctrl-NもCtrl-
nもCtrl-.も同じコードを送信するはずです。ただそれだと混乱を招くのは明白なので、Ctrl-NとCtrl-
nだけ有効にしたのでしょう。そしてどちらも同じSOを送信するはずです。

[![画像の説明をここに入力](https://i.stack.imgur.com/7OmYS.gif)](https://i.stack.imgur.com/7OmYS.gif)

Unix端末に表示される一見ランダムに見える記号たち(^[がエスケープとか^Mが改行とか）も7bitの上位2bitをマスクした結果だったわけで、根拠がはっきりしました。

このマニュアルには、この他にもPrint Screen, Scroll lock,
Pause/Breakなど普段使うことのないキーの本来の目的が書かれていて興味深かったです。

**追加調査**

emacsではCtrl-/でUndoができますが、同行のCtrl-
Oは改行を挿入するコマンドです。区別ができるということは単にSIを送っているわけではないはず。このコマンドはVT100の時代から変わっていないと思うので、どのようなシーケンスを送っているのか調査しました。

**結果**

[この回答](https://apple.stackexchange.com/questions/24261/how-do-i-send-c-that-
is-control-slash-to-the-terminal)によるとCtrl-/は[C0 and C1 control
codes](https://en.wikipedia.org/wiki/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](http://vt100.net/docs/vt102-ug/)のマニュアルをご覧ください。HTMLなので検索も簡単です。

[![画像の説明をここに入力](https://i.stack.imgur.com/EYeli.png)](https://i.stack.imgur.com/EYeli.png)


CC BY-SA 3.0
2016-02-12T19:15:13.790
22022
2016-02-13T06:28:38.617
2017-04-13T12:45:31.877
-1
7837
21995
answer


一般的な端末の仕様としてはECMA-48がありますが、キーでどのようなコード/シーケンスを送るかというような事はこれでは定義されていません。  
この辺りは各端末の裁量となるので、実際の端末での動作を参考にするしか無いでしょう。

一般的な端末としてはVT100やその後継機が参考とされますが、これは C-. 等が使えませんので、今時の端末としてはxtermを参考にするのがいいでしょう。  
xtermでもデフォルトの動作としては C-.
等が使えませんが、modifyCursorKeysやmodifyOtherKeys等の拡張機能を利用すればほぼすべてのキーの組み合わせが利用できますし、通常ならば区別できないC-
iとTabの区別も出来るようになります。  
バージョンの条件が合えばEmacsでもTERMがxtermの時にはmodifyOtherKeysを利用するようになっていますので、他の端末でもこの動作を参考にするのがいいと思います。

modifyOtherKeys等の動作はxtermのマニュアル[1](http://invisible-
island.net/xterm/manpage/xterm.html "man page"),[2](http://invisible-
island.net/xterm/ctlseqs/ctlseqs.html
"ctlseqs")に簡単な解説がありますが、これだけでは動作が判りづらいと思うので実際の動作も並行して確認する方がいいと思います。


CC BY-SA 3.0
2016-02-16T08:01:17.410
22162
2016-02-16T08:01:17.410
12203
21995
answer