ANSI 이스케이프 시퀀스 ^[[K는 less -R에 의해 처리되지만 대부분은 처리되지 않습니다.

ANSI 이스케이프 시퀀스 ^[[K는 less -R에 의해 처리되지만 대부분은 처리되지 않습니다.

ack코드를 로컬로 검색하고 추가 컨텍스트 줄을 호출기에 연결하기 위한 래퍼를 작성 중입니다 .

이것은 래퍼 스크립트입니다 ackc. 다른 예 사이에서 변경 사항 ack--pager.

#!/bin/sh

ack -C 20 -i \
    --pager=most \
    --heading \
    --break \
    --color \
    --show-types \
    "$@"

less(-R 없이) 호출기로 사용하면 거의 모든 이스케이프 시퀀스가 ​​캐럿을 사용하여 표시됩니다(이것이 무엇인지 ^[는 예외입니다). 이는 ESC반전된 배경색(여기서는 재현되지 않은 색상)으로 렌더링됩니다.

다음은 출력의 예입니다( ackc지워진 --pager=less환경 변수(예: 등)에 의해 LESS생성됨 LESSPIPE)

ESC[1;32m.local/lib/python2.7/site-packages/markupsafe/_speedups.cESC[0m
...
ESC[1;33m19ESC[0m:#define PY_SSIZE_T_MAX ESC[30;43mINTESC[0m_MAXESC[0mESC[K
ESC[1;33m20ESC[0m:#define PY_SSIZE_T_MIN ESC[30;43mINTESC[0m_MINESC[0mESC[K

여기서 중요한 이스케이프 시퀀스는 ^[[K강조 표시된 항목을 포함하는 각 줄 끝에 있는 시퀀스입니다. 적절하게 처리됩니다 less -R.

.local/lib/python2.7/site-packages/markupsafe/_speedups.c
...
19:#define PY_SSIZE_T_MAX INT_MAX
20:#define PY_SSIZE_T_MIN INT_MIN

most그런데 잘 처리되지 않는 것 같습니다.

.local/lib/python2.7/site-packages/markupsafe/_speedups.c
1-/**
...
19:#define PY_SSIZE_T_MAX INT_MAX^[[K
20:#define PY_SSIZE_T_MIN INT_MIN^[[K

^[[K그대로 순서대로 진행됩니다.

이 시퀀스는 입니다 CSI (n) K -- EL -- Erase in Line. 인수가 지정되지 않으면 줄 끝까지 지워집니다. 일치하는 용어가 줄 끝에 나타나면 배경색의 흩어진 부분을 정리하는 데 필요할 수 있습니다.

most이 순서를 이해하지 못할 이유가 있나요 ? 올바르게 처리하도록 구성할 수 있나요?

답변1

대부분의 동작은 하드코딩되어 있습니다. 소스 코드에는 이스케이프 문자를 받은 후 구문 분석을 위한 다음과 같은 여러 블록이 있습니다.

     if ((ch == 033) && (Most_V_Opt == 0))
       {
      while ((ch == 033)
         && (0 == most_parse_color_escape (&b, e, NULL))
         && (b < e))
        ch = *b++;
       }

기본적으로 이는 이스케이프 문자가 발견된 경우를 의미합니다(033)그리고-V옵션이 설정되지 않은 경우 ANSI 색상 이스케이프 시퀀스를 찾으십시오.

모든 지우기 작업도 이스케이프 문자로 시작하므로최대요청한 작업을 수행하지 않습니다.

그런데 며칠 전에 Davis가 해결 방법으로 변경한 것을 보았습니다. 결국 이것은 패키지 버전이 될 것입니다 ...

작성자: 존 데이비스 2018-07-11 06:26:02
제출자: 존 E. 데이비스 2018-07-11 06:26:02
상위: 97befd7b984520e80475bb1cb857b35650755a15(5.1-20 이전: Home/End 키에 대한 지원 추가)
분기: 마스터, 원격/원본/마스터
다음과 같이:
접두사:

    pre5.1-21: isatty(fileno(sdout)) 값에 관계없이 줄 끝 이스케이프 시퀀스(ESC[K))를 사용하여 출력 색상을 지정하려는 프로그램에 대한 해결 방법이 추가되었습니다.

+21. src/line.c: 색상화를 시도하는 프로그램에 대한 해결 방법 추가
+ 줄 끝 이스케이프 시퀀스(ESC[K)에 대한 명확한 출력 사용
+ isatty(fileno(sdout)) 값은 고려되지 않습니다. 대부분의 사람들은 그럴 것이다
+ -v로 호출하지 않는 한 ESC[K를 무시합니다.

관련 정보