E437: terminal capability “cm” requiredの対処方法
概要
GNU screenを起動した状態でsshで他のサーバーにログインすると,TERM
環境変数にscreen.xterm-256color
が設定される。
この状態で,vi/vim
を起動したりgit log
などで端末機能を使用すると,エラーが出ることがある。
例えば,Vimだと以下のエラーが出て,画面表示が乱れる。
vi
E437: terminal capability "cm" required Press ENTER or type command to continue
git log
だと以下の警告が表示されて画面表示が乱れる。
git log
WARNING: terminal is not fully functional
export
コマンドでTERM
環境変数をscreen.xterm-256color
から他の環境変数 (xterm-256color
など) に変更すればひとまず解決する。
export TERM=xterm-256color
ただ,現在GNU screenを実行中かどうかの判定ができなくなったり,単純にこの問題が発生するのが鬱陶しい。
そこで,重い腰を上げて対処方法を検討したので記す。
方法
まず,TERM=screen.xterm-256color
だが,OS自体はこの端末種別を認識できているようだ。「利用可能な端末種別 (TERM) の判定方法」に記した通り,以下のコマンドが成功した。
tput -T screen.xterm-256color longname
そのため,screen.xterm-256color
の端末種別自体の問題ではなさそうだ。
他の事例を調べたところ,この問題は以下のサイトでも報告されていた。
この2個目のサイトでの報告が参考になった。こちらのサイトでは,ncurses-termというパッケージをインストールして対処している。
肝心のncurses-termパッケージの中身は以下のコマンドで確認できる。
apt-file list ncurses-term
出力結果を見ると,/usr/share/terminfo
配下のterminfoデータベースが格納されている。
内容からして,ncursesをインストールすれば解決するように思った。
実際に,「インストール: ncurses | 端末操作の基本ライブラリー」に記した手順でインストールすれば,警告が表示されなくなった。
インストールされるリソース (share配下) が重要なので,configure
実行時には--with-shared --with-termlib
などのオプションはなくても問題ない。
ポイントとしては,TERMINFO
環境変数の設定が必須なところだ。
LOCAL=~/.local
export TERMINFO=$LOCAL/share/terminfo/
この環境変数でncursesを使用するプログラムからterminfoデータベースの参照先を指定している。そのため,ローカルにインストールしたterminfoデータベースをこの環境変数で指定する必要がある。
結論
端末の表示がおかしくなる問題に対応した。
端末周りのトラブルはncursesやGNU Readlineなどの端末関係のライブラリーのインストールで解決することが多い。
かなりニッチな問題だが,問題の根本的な解決ができてよかった。