screen
の実行方法に応じて、適切なTERMCAP情報がある場合とない場合があります。これの症状は、色が端末に正しく表示されない場合があることです(例:ls、vim構文の強調表示など)。
これは正常に機能します。
$ echo $TERMCAP
<empty output>
$ screen -S foo
$ screen -r foo
<now I'm inside a screen session>
$ echo $TERMCAP
<long output>
$ ls
<Nice pretty colors>
これには問題があります:
$ echo $TERMCAP
<empty output>
$ screen -d -m -S foo
$ screen -r foo
<now I'm inside a screen session>
$ echo $TERMCAP
<long output, but different than before>
$ ls
<no colors ):>
今、私はこれを回避することができます。 TERMCAPを手動でいじることができます。
しかし、私は本当に何が起こっているのかを理解したいと思います。可能であれば、「クリーンな」ソリューションを見つけたいと思います。
ここで何が起こっているのか誰か知っていますか? screen
を実行するときに-d -m
を使用すると、どのような違いがありますか?
それが重要な場合、これはFreeBSD上にあります。
-d -m
オプションを使用すると、screen
はdetachedモードで開始し、その場合、現在のTERM
変数に基づいて端末の説明を改善しようとはしません。 TERM
変数は、正常に起動されたとき(切り離されていないとき)にのみ検索されます。デタッチを開始したセッションに接続する場合、TERM
に基づいてこの初期化を行うには遅すぎます。
マニュアルのセクション16.1ウィンドウのtermcapエントリの選択は、それが行う修正のいくつかを説明しています。
動作しないケースで見たものは次のようになります。
TERMCAP = SC | screen | VT 100/ANSI X3.64仮想端末:\ :DO =\E [%dB:LE =\E [%dD:RI =\E [% dC:UP =\E [%dA:bs:bt =\E [Z:\ :cd =\E [J:ce =\E [K:cl =\E [H\E [J :cm =\E [%i%d;%dH:ct =\E [3g:\ :do = ^ J:nd =\E [C:pt:rc =\E8:rs =\Ec:sc =\E7:st =\EH:up =\EM:\ :le = ^ H:bl = ^ G:cr = ^ M:it#8:ho =\E [H: nw =\EE:ta = ^ I:is =\E)0:\ :li#24:co#80:am:xn:xv:LP:sr =\EM:al =\E [ L:AL =\E [%dL:\ :cs =\E [%i%d;%dr:dl =\E [M:DL =\E [%dM:dc =\E [ P:DC =\E [%dP:\ :im =\E [4h:ei =\E [4l:mi:IC =\E [%d @:ks =\E [?1h\E =:\ :ke =\E [?1l\E>:vi =\E [?25l:ve =\E [34h\E [?25h:vs =\E [34l:\ :ti =\E [?1049h:te =\E [?1049l:k0 =\E [10〜:k1 =\EOP:k2 =\EOQ:\ :k3 =\EOR :k4 =\EOS:k5 =\E [15〜:k6 =\E [17〜:k7 =\E [18〜:\ :k8 =\E [19〜:k9 =\E [ 20〜:k; =\E [21〜:F1 =\E [23〜:F2 =\E [24〜:\ :kh =\E [1〜:@ 1 =\E [1 〜:kH =\E [4〜:@ 7 =\E [4〜:kN =\E [6〜:kP =\E [5〜:\ :kI =\E [2〜: kD =\E [3〜:ku =\EOA:kd =\EOB:kr =\EOC:kl =\EOD:
良いものは次のようになりますが:
TERMCAP = SC | screen | VT 100/ANSI X3.64仮想端末:\ :DO =\E [%dB:LE =\E [%dD:RI =\E [% dC:UP =\E [%dA:bs:bt =\E [Z:\ :cd =\E [J:ce =\E [K:cl =\E [H\E [J :cm =\E [%i%d;%dH:ct =\E [3g:\ :do = ^ J:nd =\E [C:pt:rc =\E8:rs =\Ec:sc =\E7:st =\EH:up =\EM:\ :le = ^ H:bl = ^ G:cr = ^ M:it#8:ho =\E [H: nw =\EE:ta = ^ I:is =\E)0:\ :li#25:co#80:am:xn:xv:LP:sr =\EM:al =\E [ L:AL =\E [%dL:\ :cs =\E [%i%d;%dr:dl =\E [M:DL =\E [%dM:dc =\E [ P:DC =\E [%dP:\ :im =\E [4h:ei =\E [4l:mi:IC =\E [%d @:ks =\E [?1h\E =:\ :ke =\E [?1l\E>:vi =\E [?25l:ve =\E [34h\E [?25h:vs =\E [34l:\ :ti =\E [?1049h:te =\E [?1049l:us =\E [4m:ue =\E [24m:so =\E [3m:\ :se =\E [23m:md =\E [1m:mr =\E [7m:me =\E [m:ms:\ :Co#8:pa#64:AF =\E [3 %dm:AB =\E [4%dm:op =\E [39; 49m:AX:G0:\ :as =\E(0:ae =\E(B:\ :ac =\140\140aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz {{||}} ~~ ..-- ++ , hhII00:\ :k0 =\E [10〜:k1 =\EOP:k2 =\EOQ:k3 =\EOR:k4 =\EOS:k5 =\E [15 〜:\ :k6 =\E [17〜:k7 =\E [18〜:k8 =\E [19〜:k9 =\E [20〜:k; =\E [21〜:\ :F1 =\E [23〜:F2 =\E [24〜:kb = ^ H:K2 =\EOE:kB =\E [Z:kh =\E [1〜:\ :@ 1 =\E [1〜:kH =\E [4〜:@ 7 =\E [4〜:kN =\E [6〜:kP =\E [5〜:kI =\E [2〜:\ :kD =\E [3〜:ku =\EOA:kd =\EOB:kr =\EOC:kl =\EOD:km:
良いケースでは、screen
はTERM
がxterm
に設定されていることに気づき、その説明から機能を追加しました。
screen
で配布されたtermcapには色がないため、FreeBSDでこの問題に気付くでしょう。これは、説明をtermcapアプリケーションで想定される1023バイトの制限に制限すると(余分な設定は破棄されます)。他のプラットフォームでは、ncursesによって提供される description を使用する可能性があります。これはdoes色の使用方法を示します。違いは、使用されているライブラリによるものではありません。 screen
は termcapアプリケーション ですが、FreeBSDではncursesを使用します。
$ ldd `which screen`
/usr/local/bin/screen:
libncurses.so.8 => /lib/libncurses.so.8 (0x80086a000)
libelf.so.1 => /usr/lib/libelf.so.1 (0x800ab6000)
libutil.so.9 => /lib/libutil.so.9 (0x800ccb000)
libulog.so.0 => /lib/libulog.so.0 (0x800edd000)
libcrypt.so.5 => /lib/libcrypt.so.5 (0x8010df000)
libc.so.7 => /lib/libc.so.7 (0x8012ff000)
libmd.so.6 => /lib/libmd.so.6 (0x801698000)
代わりに、違いは
TERM=xterm
を使用したコンソールと実際のxtermを区別するために、 色付きのVT1 、 変更 などの癖があります。あまり目立たない(もちろん、xtermを使用している人を除く)。皮肉なことに、screen
がTERMCAP
を複数行形式に設定していることに気付くかもしれません。これは4.2BSDと4.3BSDで使用されていましたが、4.4BSD(約25年前)では廃止され、ハッシュデータベースの使用に切り替わり、同時に空白(termcapサイズの1023バイト制限にカウントされます)が破棄されました。 。 FreeBSD 1990年代にncursesの使用に切り替えられた なので、その形式はより古く、TERMCAP
変数に依存するアプリケーションはほとんどありません。しかし、ls
はその1つです。
screen
にはオプション-T
があります。これはshould特定のtermcapエントリ(色付き)を指定することでこれを支援しますが、テストすると、問題を解決できないようです。
参考文献:
まあ、私は問題を修正するためにあまりにもグロスではない何かを得ました:
screen
セッションを作成しているスクリプトでは、上部に次のように表示されます。
# This runs the commands:
# TERM=screen
# TERMCAP='...'
# with values appropriate for a 'screen' terminal
eval "$(tset - -s screen | tail -n+2)"
# Set up the SCREENCAP variable, which 'screen' will use for new sessions
SCREENCAP="$TERMCAP"; export SCREENCAP
# ...
screen -d -m -S my-session
これで、my-session
に接続すると、端末の色が機能します。
完全に満足できるわけではありませんが、十分に機能します。