xterm-color の TermInfo がない @ Solaris

ref: http://www.linux.or.jp/JF/JFdocs/Text-Terminal-HOWTO-15.html

最近新しい環境に ssh でログインすることがあったのだが、その際に

  • vi, emacs, less などなどがまともに立ち上がらない
  • シェルによっては Backspace などが効かない

ということがあってハマったのでメモ。

結局、これは端末の種類に対応する terminfo がなかったために起きていたようだ。

Terminfo とは

先頭にある ref 先に詳しいが、要するに端末の種類(vt100, xterm, ...)に応じた制御文字のデータベースである。

less, vi, emacs, (bashでないある種の)シェルなどは、ここから得られる情報を使って制御文字を吐くことで端末の出力を制御する*1

ので、自分の使っている端末に応じた terminfo が当該環境に無いと、悲しいことが起こるのである。

悲しいことの例

今回問題になった環境(Solaris)では、less や emacs が以下のようなエラーメッセージを出してくれたおかげで解決できた次第。最初は zsh が何もエラーを出さずに、かつ挙動がおかしかったりしたのでハマった・・・。

less のエラーメッセージ:

WARNING: terminal is not fully functional

emacs のエラーメッセージ:

emacs: Terminal type xterm-color is not defined.
If that is not the actual type of terminal you have, use the Bourne shell command `TERM=... export TERM' (C-shell: `setenv TERM ...') to specify the correct type.
It may be necessary to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.

対処

使っている端末の種類は $TERM 環境変数を読めば出てくる。筆者の場合、

$ echo $TERM
xterm-color

だった。

で、それに対応する Terminfo が存在するかを確認するには、locate コマンドを使ってファイルを探すのが早い、と先述の ref 先には書いてあった。のだが、いかんせん件の環境では locate が core を吐いて落ちる。どうやら、調べてみたところ、Solaris の terminfo は /usr/share/lib/terminfo に置いてあるそうである。

TERMINFO – terminfo データベースに追加された、デフォルトでない端末のパス名を指定します。terminfo データベース内のデフォルト端末については、この変数を設定する必要はありません。terminfo データベースの詳細は、『Solaris のシステム管理 (上級編)』を参照してください。

TERM – 現在使っている端末を指定します。エディタを実行するときは、TERM 変数で定義された名前と同じ名前のファイルが検索されます。その場合、まず最初に TERMINFO 変数で指定されるパスが検索され (TERMINFO が定義されている場合)、次にデフォルトディレクトリの /usr/share/lib/terminfo が検索されて、端末の特性が決定されます。TERM 変数で定義されたファイルが見つからない場合は、その端末はダム端末と認識されます。

http://docs.sun.com/app/docs/doc/816-3946/6ma6m5bp5?l=Ja&a=view

また、上にもあるとおり、デフォルトの terminfo の置き場所(/usr/share/lib/terminfo)の前に、$TERMINFO で設定したパスを探索してくれる。

terminfo の置き場は、先頭一文字のディレクトリをほって、その下にコンパイル済みの*2 terminfo ファイルを置いてやると良いようだ。

件の環境での例:

$ ls /usr/share/lib/terminfo
1  3  5  7  9  B  H  P  a  c  e  g  i  k  m  o  q  s  u  w  y
2  4  6  8  A  G  M  S  b  d  f  h  j  l  n  p  r  t  v  x  z
$ ls /usr/share/lib/terminfo/x
x1700     x1750     xitex     xpcterm   xtalk     xtermc    xterms
x1720     x820      xl83      xpcterms  xterm     xtermm

この辺の挙動についても、冒頭の ref 先の説明が分かりやすい*3

そこで、

$ ls ~/.terminfo
x
$ ls ~/.terminfo/x
xterm-color

という構造になるように terminfo を置いてから、

export TERMINFO=/home/myname/.terminfo

と設定してやると、emacs なり zsh なりも無事に使えるようになったのである。

*1:ncurses とかがそうなっている

*2:要するにバイナリな

*3:Solaris のシステム管理 (上級編)』を検索してもそれらしき記述が無かった・・・