Nun, das ist nervig. Was geht hier vor sich? (in tmux
unter iTerm.app
)
$ echo test > test ; echo $TERM
screen
und dann mit etwas Aufnahme
$ 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 ...
und jetzt schauen wir uns die verwendeten Codes an
$ 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
$
Die 1b 5b ...
Codes können verständlicher gemacht werden, indem die Dokumentation der xterm-Steuersequenzen konsultiert wird, oder man kann manuell mit den Sequenzen herumspielen, um zu sehen, welche unter TERM=xterm
die Hervorhebung verursacht
$ printf "\033[7mtest\033[27m\n"
test
Was der TERM=screen
Fall nicht tut, ist gemäß den Kontrollsequenzdokumenten eine Umkehrung
ESC [
Control Sequence Introducer (CSI is 0x9b).
...
CSI Pm m Character Attributes (SGR).
...
Ps = 7 -> Inverse.
...
Ps = 2 7 -> Positive (not inverse).
und in der Nähe von diesem Dokument können wir erfahren, dass das screen
Terminal \033[3m
für kursiv und \033[23m
nicht kursiv ist .
Dieser Befund gibt einige Optionen; Wir könnten das Terminal so konfigurieren, dass kursiver Text angezeigt wird, oder wir könnten stattdessen versuchen, das screen
Terminal dazu zu bringen, die inversen Codes anstelle von Kursivschrift zu verwenden. (Einige Stöbern in den less(1)
Dokumenten zeigten keine eindeutigen "Inverse statt Kursiv" -Knöpfe zum Fummeln.) (Einige Terminals bieten möglicherweise Unterstützung für die Übersetzung von X nach Y, überprüfen Sie die Terminal-Dokumente auf Details.) (Oder Sie könnten Probieren Sie einen anderen Terminalemulator aus und sehen Sie, was dieser macht ...)
Wow kursiver Text ist hässlich . Versuchen wir stattdessen, die Codes screen
zu ändern, um sie umzukehren. Dies betrifft offensichtlich die terminfo
(oder möglicherweise termcap
) Datenbank, die über exportiert infocmp(1)
und von kompiliert werden kanntic(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,
$
Also würde ich vermuten smso
, dass das xterm
verwendet wird, wenn es verwendet \E[7m
und screen
\E[3m
; demnach terminfo(5)
ist "herausragender Modus" und wird mit dem Rückwärtsgang gepaart rmso
; Lassen Sie uns diese ändern, was xterm
verwendet wird ...
$ TERM=screen infocmp | sed -e 's/smso=[^,]*/smso=\\E[7m/;s/rmso=[^,]*/rmso=\\E[27m/' > foo
$ tic -o ~/.terminfo foo
$ rm foo
Hey, das sieht jetzt besser aus (muss aber auf allen Hosts für die screen
oder welche terminfo
Datei auch immer gemacht werden ...)