読者です 読者をやめる 読者になる 読者になる

かりっと揚げたらフライドポテト

㍋出る迄頑張るぞい

MacのTerminalのカラー設定を変えたらVim終了時コンソール復元しなくなった話

まだTerminal触り初めの頃、とりあえず画面をかっこよくしたいなと思って以下の記事を参考にカラー設定をSolarizedにしたことがあった。

qiita.com

導入すると、Vimなどのフルスクリーンアプリを使用する際にコンソール復元ができなくなっていることに気づく。当時は違和感を覚えるくらいで「まぁいっか」なんて流してたが、やっぱり不便だし治すことに。

oshiete.goo.ne.jp

 

こちらを参考にして

echo $TERM

を叩くと

ansi

と出た。ansiってなんだ?というのは置いといて、どうやらこれがxtermじゃないのが問題だったみたいだ。

そこでTerminalの設定を開いて使用しているprofileの詳細タブでTerminfoを確認し、これをxtermに変更した。

 

f:id:jaga810:20170314122459p:plain

コレで元通りコンソールが復元するようになった。

 

以下蛇足。

環境変数マニュアル で$TERMを見ると以下のように記述される

emacs や vi では、1文字戻ったり画面をクリアする際、エスケープシーケンスを出力している。しかしエスケープシーケンスは端末の種類によって違うので、ユーザが今どの種類の端末を利用しているのかをプログラムに伝えるのが環境変数 TERM の役割なのだ。

そしてtermcapとterminfo | doda's blogの通り、

termcapやterminfoは、端末の動作の違いを吸収するためにあります。

dateやcatなどの大多数の一般的なコマンドでは文字列を順番に出力するだけなので、端末の違いが影響する事はほとんどありません。これに対しviなどの画面全体を使うようなプログラムでは、カーソルを指定した位置に移動したり、指定した位置に新しい行を挿入するといった操作が必要になります。こういった操作は端末に対して命令として解釈される文字列(制御シーケンス)を出力して行うのですが、この命令用の文字列は端末の種類によって違ったりします。そこでプログラムは、使用している端末(環境変数TERMで指定します)で使いたい機能がどのような文字列になるかをtermcapやterminfoで調べて出力します

terminfoとはエスケープシーケンスに関するDBのような役割を果たすらしい。

これによりフルスクリーンアプリを終了したときに元のコンソールの状態に復元する - 技術メモ帳で見かけた

本当は vim などのフルスクリーンアプリは"元のコンソール状態" に復元しようと、enter_ca_mode / exit_ca_mode というものを出力するのだが、このときに、端末データベースから"実際に出力すべきエスケープシーケンス" というものを取得しており、ここが正しく設定されていないため、うまく元のコンソールに戻らない。

という文言の意味が分かった。

ansiのためのterminfo、すなわちエスケープシーケンスのDBが取得できなかったがために、enter_ca_mode / exit_ca_modeが正しく出力されず、復元が失敗した。