E437: terminal capability “cm” requiredの対処方法

GNOME Terminal

概要

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の端末種別自体の問題ではなさそうだ。

他の事例を調べたところ,この問題は以下のサイトでも報告されていた。

報告例
  1. GNU screen内からsshした先にTERM=screen.xterm-256color等がない場合の対処法
  2. viやvimで「Encounter E437: terminal capability “cm” required」が出た時の対処法 – Qiita

この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などの端末関係のライブラリーのインストールで解決することが多い。

かなりニッチな問題だが,問題の根本的な解決ができてよかった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です