viエディタが奇妙に閉じます

viエディタが奇妙に閉じます

エディタを閉じた後vi(ファイル全体をロードせずに)、

-bash-3.2$ vi /var/spool/mail/user1
-bash-3.2$ 0;136;0c

ヒントを残してください。コンテンツがロードされ0;136;0cていないか、何が起こる可能性がありますか?vi

答え1

vim理由を正確には言えないいくつかのことがあります。まず、 heirloom を使用してvileいるのnviか heirloom を使用しているのかわかりませんvi。 2番目に私が知らないのは閉じる方法ですvi。しかし、推測してみましょう。

私が知っている限り、すべてのviプログラムは画面に表示される内容を制御するためにエスケープシーケンスを使用します。つまり、Windowsシステムコールを使用してカーソル位置を指定し、テキストを書き込むのではなく、viTERM環境変数の値を使用して出力する必要がある端末を見つけます。 TERM値に応じて、通常または常に0x1b、ASCII "ESC"、またはエスケープ文字で始まる特殊バイトシーケンスを送信します。特殊バイトを「エスケープシーケンス」と呼びます。

過去には、シリアル端末ハードウェアがカーソルの移動、テキストの色やフォントの変更、線の描画、これらのエスケープシーケンスに基づいて他の文字セットへの変更などの特別な作業を行いました。vi私が知っている限り、彼らはまだ使用されています。完全なエスケープシーケンスは、Cプログラムで利用可能な「curses」または「ncurses」というライブラリに抽象化されています。

私の考えでは、閉じるとvi(おそらくcontrol-Cまたはcontrol-backslashを使用して)viいくつかのエスケープシーケンスを出力しています。あなたが見るのは、対応するエスケープシーケンスの最後の数バイトです。実際のASCII "ESC"バイトは決して出力されないか、control-Cの前に出力され、ターミナルはcontrol-Cをエスケープシーケンスの一部として解釈するため、このように表示されます。端末が解釈すると考えるエスケープシーケンスがviバイトシーケンス出力より短い場合、予想されるエスケープシーケンスの残りの部分を見ることができます。

関連情報