web-dev-qa-db-ja.com

GNU画面:-d-mを使用すると奇妙なTERMCAP

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上にあります。

3
jwd

-d -mオプションを使用すると、screendetachedモードで開始し、その場合、現在の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:

良いケースでは、screenTERMxtermに設定されていることに気づき、その説明から機能を追加しました。

screenで配布されたtermcapには色がないため、FreeBSDでこの問題に気付くでしょう。これは、説明をtermcapアプリケーションで想定される1023バイトの制限に制限すると(余分な設定は破棄されます)。他のプラットフォームでは、ncursesによって提供される description を使用する可能性があります。これはdoes色の使用方法を示します。違いは、使用されているライブラリによるものではありません。 screentermcapアプリケーション ですが、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)

代わりに、違いは

  • FreeBSDは、terminfoよりもtermcapデータベースを使用してncursesを構築し(ポートを使用してterminfoデータベースを取得できます)、
  • FreeBSDにはtermcapファイルがありますが、これは他の端末データベースとは一致しません。いくつかの修正が行われましたが、TERM=xtermを使用したコンソールと実際のxtermを区別するために、 色付きのVT1変更 などの癖があります。あまり目立たない(もちろん、xtermを使用している人を除く)。

皮肉なことに、screenTERMCAPを複数行形式に設定していることに気付くかもしれません。これは4.2BSDと4.3BSDで使用されていましたが、4.4BSD(約25年前)では廃止され、ハッシュデータベースの使用に切り替わり、同時に空白(termcapサイズの1023バイト制限にカウントされます)が破棄されました。 。 FreeBSD 1990年代にncursesの使用に切り替えられた なので、その形式はより古く、TERMCAP変数に依存するアプリケーションはほとんどありません。しかし、lsはその1つです。

screenにはオプション-Tがあります。これはshould特定のtermcapエントリ(色付き)を指定することでこれを支援しますが、テストすると、問題を解決できないようです。

参考文献:

2
Thomas Dickey

まあ、私は問題を修正するためにあまりにもグロスではない何かを得ました:

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に接続すると、端末の色が機能します。

完全に満足できるわけではありませんが、十分に機能します。

2
jwd