Vâng, điều này thật khó chịu. Chuyện gì đang xảy ra ở đây? (ở tmux
dưới iTerm.app
)
$ echo test > test ; echo $TERM
screen
và sau đó với một số ghi âm
$ 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 ...
và bây giờ chúng tôi xem xét các mã được sử dụng
$ 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
$
các 1b 5b ...
mã có thể được hiển thị dễ hiểu hơn bằng cách tham khảo tài liệu trình tự điều khiển xterm hoặc người ta có thể tìm hiểu thủ công các trình tự để xem phần nào TERM=xterm
gây ra sự nổi bật
$ printf "\033[7mtest\033[27m\n"
test
điều mà TERM=screen
trường hợp không làm, theo các trình tự kiểm soát tài liệu đó là một nghịch đảo
ESC [
Control Sequence Introducer (CSI is 0x9b).
...
CSI Pm m Character Attributes (SGR).
...
Ps = 7 -> Inverse.
...
Ps = 2 7 -> Positive (not inverse).
và gần đó từ tài liệu đó, chúng ta có thể biết rằng screen
thiết bị đầu cuối \033[3m
dành cho In nghiêng và \033[23m
Không in nghiêng .
Phát hiện này cung cấp một số tùy chọn; chúng tôi có thể định cấu hình thiết bị đầu cuối để hiển thị văn bản in nghiêng hoặc thay vào đó chúng tôi có thể cố gắng làm cho screen
thiết bị đầu cuối sử dụng mã ngược thay vì in nghiêng. (Một số đào xung quanh trong các less(1)
tài liệu không cho thấy bất kỳ "sử dụng nghịch đảo thay vì nghiêng" rõ ràng nút bấm thay vì chỉ violong với.) (Ngoài ra, một số thiết bị đầu cuối có thể cung cấp hỗ trợ cho các dịch X đến Y, kiểm tra tài liệu thiết bị đầu cuối để biết chi tiết.) (Hoặc bạn có thể thử một trình giả lập thiết bị đầu cuối khác và xem cái đó làm gì ...)
Wow chữ in nghiêng là xấu xí . Thay vào đó, hãy thử thay đổi mã screen
sử dụng thành nghịch đảo. Điều này rõ ràng liên quan đến cơ sở dữ liệu terminfo
(hoặc có thể termcap
), có thể được xuất qua infocmp(1)
và được biên dịch bởitic(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,
$
Vì vậy, tôi đoán rằng smso
đang được sử dụng cho rằng xterm
sử dụng \E[7m
và screen
\E[3m
; theo terminfo(5)
đó là "chế độ nổi bật" và được ghép nối với đảo ngược rmso
; Hãy thay đổi những thứ đó thành những gì xterm
sử dụng ...
$ TERM=screen infocmp | sed -e 's/smso=[^,]*/smso=\\E[7m/;s/rmso=[^,]*/rmso=\\E[27m/' > foo
$ tic -o ~/.terminfo foo
$ rm foo
Bây giờ có vẻ tốt hơn (nhưng sẽ phải được thực hiện trên tất cả các máy chủ cho screen
hoặc bất kỳ terminfo
tệp nào ...)