굵은 글꼴 렌더링을 제어하는 ​​터미널 에뮬레이터 설정

굵은 글꼴 렌더링을 제어하는 ​​터미널 에뮬레이터 설정

굵은 글꼴(ANSI: )의 효과는 CSI 1 m터미널 에뮬레이터에 따라 달라지는 것 같습니다. 예를 들어 다른 터미널 에뮬레이터에서 다음 스크립트를 실행합니다.

#!/bin/sh
echo "TERM = $TERM"
for mode in 0 2 1 '1;2'; do
    printf '\033[%s;38;5;%dm\033[48;5;%dm%s\033[0m\n' "$mode" 0 15 "testing ($mode)"
done

다음과 같은 출력을 제공합니다

여기에 이미지 설명을 입력하세요.

테스트된 터미널 에뮬레이터에서는 xterm굵은 텍스트만 올바르게 렌더링되었습니다(모드=1). 다른 터미널 에뮬레이터는 굵은 글꼴에 대해 더 밝은 색상을 선택하는 것 같습니다(종종 굵은 글꼴과 결합하기도 함). 이상하게 st도 인수가 주어지면 1;2에 해당하는 올바른 색상의 굵은 텍스트가 생성됩니다 bold;faint.

이러한 터미널 에뮬레이터에는 다른 굵은 제어 시퀀스가 ​​필요할 수 있다고 생각했지만 확인했지만 terminfo일관성이 있는 것으로 나타났습니다.

$ for term in xterm-256color st-256color rxvt-unicode-256color tmux-256color; do printf "%-24s" "$term"; TERM=$term tput bold | cat -v; echo; done
xterm-256color          ^[[1m
st-256color             ^[[1m
rxvt-unicode-256color   ^[[1m
tmux-256color           ^[[1m

이는 어떤 터미널 에뮬레이터 매개변수가 굵은 글꼴의 효과를 제어하는지에 대한 질문을 제기합니다. 더 밝은 색상으로의 전환을 방지하는 방법은 무엇입니까? 커스터마이징으로 해결할 수 있나요 Xresources? terminfo(그런데 해당 매개변수가 있나요 vim? 비슷한 동작을 보여주지만 이를 실행하는 터미널 에뮬레이터의 동작과 반드시 ​​일치하지는 않습니다.)

답변1

CSI 1 m알다시피 굵은 글꼴을 표시하는 이스케이프 시퀀스는 단 하나뿐입니다.

이 때문에 안돼진짜vimterminfo 정의와 같은 구성을 거치지 않고도 애플리케이션(예: ) 측에서 동작을 변경하는 방법입니다 . (이 진술은 나중에 수정하겠습니다.)

원하는 동작을 달성하는 방법은 그에 따라 터미널 에뮬레이터를 구성하는 것입니다. xterm +pc또는 urxvt +is설명서에 표시된 대로 해당 Xresource 설정을 찾고 있습니다 . st그런 옵션이 있는지는 모르겠습니다 .

tmux나는 그래픽 에뮬레이터의 실제 동작을 제어하지 않는 그런 옵션이 정말로 없다고 생각합니다 . 이론적으로는 나중에 언급할 트릭을 시도할 수도 있지만 실제로는 그렇지 않을 것 같습니다.


몇 가지 역사적 배경을 설명하자면 다음과 같습니다.

기준에 따르면 CSI 1 m'대담하다, 강도를 높이다'라는 뜻이므로 엄밀히 말하면 두 가지 행위 모두 옳은 행동이다. 역사적으로 그래픽 터미널 에뮬레이터는 두 기능을 모두 지원했습니다.

이는 전통적인 8/16 팔레트에 약간의 의미가 있습니다. 이는 널리 사용되는 확장된 256색 팔레트나 오늘날 대부분의 그래픽 터미널 에뮬레이터에서 지원되는 RGB의 경우에는 해당되지 않습니다. 정말 나쁜 점은 상위 8개 팔레트 색상(실제로는 사용자가 가장 좋아하는 8개 색상)을 굵은 글꼴로 안정적으로 생성하는 이스케이프 시퀀스가 ​​없다는 것입니다.

이를 보고 최근 몇몇 터미널 에뮬레이터는 색상을 더 밝게 하지 않고 글꼴을 더 굵게만 만드는 것으로 전환했습니다(원하는 것). 귀하가 언급한 터미널 중 기본 설정이 이렇게 변경된 터미널은 없다고 생각합니다. 그러나 이에 대한 제가 알고 있는 정보는 쉽게 구식이 될 수 있습니다.


거기에 언급했어요가능한애플리케이션의 동작을 변경하는 방법입니다.

처음 8개 팔레트 색상 중 하나를 요청하는 두 가지 이스케이프 시퀀스가 ​​있습니다. 기존 색상( CSI 30..37 m)과 해당 색인이 있는 256색 색상( CSI 38;5;0..7 m)입니다. 굵은 글씨/밝은 속성과 함께 사용하면 일부 터미널 에뮬레이터의 일부 버전이 두 CSI 1 m. 예를 들어, 내가 정확하게 기억한다면 일부 버전은 xterm이전 색상 이스케이프를 사용하는 경우에만 밝은 색상으로 변경되지만 256 색상 이스케이프를 사용하는 경우에는 변경되지 않습니다. 내가 올바르게 기억한다면 xterm은 나중에 이 동작을 변경했습니다.

어쨌든 이러한 터미널 에뮬레이터를 사용하는 경우 해결 방법은 setaf이전 코드 대신 처음 8개 색상의 256색 시퀀스를 내보내도록 terminfo를 수정하는 것일 수 있습니다.

이는 기본 전경색의 굵게/밝게 동작을 변경하지 않으며 CSI 1 m이 terminfo 해킹을 사용하는 대신 터미널 에뮬레이터를 구성하는 것이 좋습니다.


더 재미있고 모피적인 세부 사항에 관심이 있다면 다음 링크와 거기에 링크된 다른 페이지에 관심이 있을 수 있습니다.
https://bugzilla.gnome.org/show_bug.cgi?id=762247
https://bugzilla.gnome.org/show_bug.cgi?id=791596

답변2

~처럼에그몽 지적, 대담하고 밝은 동작은 xterm또는 를 실행하여 억제할 수 있습니다. 알고 싶으신 분들을 위해urxvtxterm +pcurxvt +isst, 그 대담하고 밝은 행동 xdrawglyphfontspecs()xc,

/* Change basic system colors [0-7] to bright system colors [8-15] */
if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7))
    fg = &dc.col[base.fg + 8];

BETWEEN()이름에서 알 수 있듯이 어디입니까?

#define BETWEEN(x, a, b)    ((a) <= (x) && (x) <= (b))

교체는 기존 8/16 팔레트의 처음 8개 색상에만 적용되며 이는 Egmont의 발언과 일치합니다. 제목세인트 헥터ATTR_BOLD_FAINTsum 의 비트별 ATTR_BOLD = 1<<0OR 로 정의됩니다 ATTR_FAINT = 1<<1. 따라서 색상 재매핑은 굵은 속성이 설정된 경우에만 발생하고 희미한 속성은 설정되지 않은 경우에만 발생합니다. 의도적이든 아니든, CSI 1 mbold() 및 희미한() 속성을 전달하는 이스케이프 시퀀스는 CSI 2 m질문에 표시된 대로 이 조건을 충족하지 않아 굵은 글꼴을 생성합니다.

원칙적으로 굵게 속성의 이스케이프 시퀀스를 변경하여 굵게 표시되지만 약하지 않은 조건을 활용하여 굵은 텍스트를 얻는 것이 가능합니다.거룩한 메시지표준 값( \E[1m)에서 로 \E[1;2m또는 굵은 속성을 설정할 때 약한 속성을 설정하여( 에서 case 1수정 하여)tsetattr()스테인레스 스틸도착하다 term.c.attr.mode |= (ATTR_BOLD | ATTR_FAINT)). 이러한 변경 사항을 사용하면 원하는 결과를 얻을 수 있지만질문), 둘 다 권장되지 않습니다(여러 가지 이유로).

보다 직접적이고 선호되는 접근 방식은 단순히 굵은 조명 조건을 제거하는 것이며 xdrawglyphfontspecs()이미 하나의 조건이 있음이 밝혀졌습니다.수리하다그것이 바로 그것이 하는 일입니다.

관련 정보