Bu sinir bozucu. Burada neler oluyor? ( tmux
altında iTerm.app
)
$ echo test > test ; echo $TERM
screen
ve sonra bazı kayıtlarla
$ script withscreen
Script started, output file is withscreen
$ less -p test test
... q to quit and then exit the shell session ...
$ script withxterm
Script started, output file is withxterm
$ TERM=xterm less -p test test
... q and exit again ...
ve şimdi kullanılan kodlara bakıyoruz
$ grep test withscreen | hexdump -C
00000000 24 20 6c 65 73 73 20 2d 70 20 74 65 73 74 20 74 |$ less -p test t|
00000010 65 73 74 0d 0d 0a 1b 5b 33 6d 74 65 73 74 1b 5b |est....[3mtest.[|
00000020 32 33 6d 0d 0a 1b 5b 35 3b 31 48 1b 5b 33 6d 74 |23m...[5;1H.[3mt|
00000030 65 73 74 1b 5b 32 33 6d 0d 0a 1b 5b 33 38 3b 31 |est.[23m...[38;1|
00000040 48 1b 5b 33 6d 74 65 73 74 20 28 45 4e 44 29 1b |H.[3mtest (END).|
00000050 5b 32 33 6d 1b 5b 4b 0d 1b 5b 4b 1b 5b 3f 31 6c |[23m.[K..[K.[?1l|
00000060 1b 3e 24 20 5e 44 0d 0d 0a |.>$ ^D...|
00000069
$ grep test withxterm | hexdump -C
00000000 24 20 54 45 52 4d 3d 78 74 65 72 6d 20 6c 65 73 |$ TERM=xterm les|
00000010 73 20 2d 70 20 74 65 73 74 20 74 65 73 74 0d 0d |s -p test test..|
00000020 0a 1b 5b 37 6d 74 65 73 74 1b 5b 32 37 6d 0d 0a |..[7mtest.[27m..|
00000030 1b 5b 35 3b 31 48 1b 5b 37 6d 74 65 73 74 1b 5b |.[5;1H.[7mtest.[|
00000040 32 37 6d 0d 0a 1b 5b 33 38 3b 31 48 1b 5b 37 6d |27m...[38;1H.[7m|
00000050 74 65 73 74 20 28 45 4e 44 29 1b 5b 32 37 6d 1b |test (END).[27m.|
00000060 5b 4b 0d 1b 5b 4b 1b 5b 3f 31 6c 1b 3e 24 20 65 |[K..[K.[?1l.>$ e|
00000070 78 69 74 0d 0d 0a |xit...|
00000076
$
1b 5b ...
kodlar başvurarak daha anlaşılır hale getirilebilir xterm kontrol dizileri belgeleri ya da bir altında görmek için sekanslar ile elle uğraşmak için TERM=xterm
vurgulama neden olan
$ printf "\033[7mtest\033[27m\n"
test
hangi TERM=screen
durumda yapmaz, ters olduğunu kontrol dizileri docs başına
ESC [
Control Sequence Introducer (CSI is 0x9b).
...
CSI Pm m Character Attributes (SGR).
...
Ps = 7 -> Inverse.
...
Ps = 2 7 -> Positive (not inverse).
ve yakındaki o belgeden biz öğrenebilir screen
terminali \033[3m
içindir italik ve \033[23m
italik değil .
Bu bulgu bazı seçenekler sunmaktadır; terminali italik metin gösterecek şekilde yapılandırabiliriz veya bunun yerine screen
terminalin italik yerine ters kod kullanmasını deneyebiliriz . ( less(1)
Dokümanlarda kazı yapmak, keman yapmak için italik düğmeler yerine ters "açık kullanım" göstermedi.) (Ayrıca, bazı terminaller X'i Y'ye çevirmek için destek sunabilir, ayrıntılar için terminal dokümanlarını kontrol edebilirsiniz.) (Veya farklı bir terminal emülatörü deneyin ve bunun ne yaptığını görün ...)
Vay canına italik metin çirkin . Bunun yerine kodları screen
ters çevirmek için değiştirmeyi deneyelim . Bu açıkça, üzerinden veya tarafından derlenebilen terminfo
(veya muhtemelen termcap
) veritabanını içerir.infocmp(1)
tic(1)
$ TERM=screen infocmp > ti.screen ; TERM=xterm infocmp > ti.xterm
$ fgrep '\E[7' ti.xterm
rc=\E8, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM,
smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m,
$ fgrep rev= ti.screen
nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
$ fgrep '\E[3m' ti.screen
smso=\E[3m, smul=\E[4m, tbc=\E[3g,
$
Ben tahmin ediyorum Yani smso
göz önüne alındığında kullanılan ediliyor xterm
kullanımlar \E[7m
ve screen
\E[3m
; buna göre terminfo(5)
"çarpıcı mod" ve tersi ile eşleştirilir rmso
; bunları xterm
kullananlara değiştirelim ...
$ TERM=screen infocmp | sed -e 's/smso=[^,]*/smso=\\E[7m/;s/rmso=[^,]*/rmso=\\E[27m/' > foo
$ tic -o ~/.terminfo foo
$ rm foo
Hey şimdi daha iyi görünüyor (ancak tüm ana bilgisayarlarda screen
veya herhangi bir terminfo
dosya için yapılması gerekecek ...)