저는 jQuery 터미널용 ANSI 형식 코드를 작성하고 있습니다. 거의 작동하지만 문제가 있습니다. 커서를 이동해야 하는 0A ansi 코드와 관련이 있습니다(다른 0 커서 코드도 있습니다: BCDEF).
나는 테스트했다아이비 도서관\x1b\[0[A-D]
터미널로 출력하기 전에 문자열에서 제거하면 효과가 있습니다.
ANSI 이스케이프가 올바르게 처리되는지 잘 모르겠습니다. 각 줄 앞에 출력을 여러 줄로 나누고 y 위치를 늘리고 x를 0으로 설정한 다음 커서 ANSI 이스케이프 코드가 있으면 커서를 이동합니다. 나는 화면의 출력을 저장하기 위해 배열의 배열을 사용합니다. (확실하지는 않지만 끝까지 한 줄로 연결하지 않으면 더 빠를 것 같은데, 속도 때문이 아니라 첫 번째 아이디어라서 그렇게 했습니다.)
0이 있으면 어떻게 해야할지 모르겠습니다.
이것은 ervy 라이브러리의 두 플롯의 출력입니다.
올바른 줄거리
코드가 0인 그림은 없습니다.
내 코드를 디버깅하려고 하는데(언젠가 플롯이 두 번째 화면에 표시될 것 같습니다) 0 ANSI 이스케이프 코드를 처리하는 방법을 모르겠습니다.
나는 그것을 사용하고 있다위키피디아참조.
답변1
\e[5A
이러한 이스케이프 시퀀스는 커서를 5줄 위로 이동, \e[10C
커서를 오른쪽으로 10열 이동 등과 같이 반복 횟수를 인수로 사용합니다 . 이 값은 다음과 같습니다.생략, 기본값은 1입니다.
하지만 매개변수가 명시적으로 0으로 지정되면 어떻게 될까요?
기준을 살펴보겠습니다. ECMA-48 및 ctlseqs.html(xterm의 동작을 문서화함)은 이에 대해 아무 말도 하지 않습니다. 즉, 암묵적으로 0으로 이동해야 함을 암시합니다. 반면, DEC STD 070에는 값 0을 1씩 이동해야 한다고 명시되어 있습니다.
구현을 살펴보겠습니다. 이러한 시퀀스 중 일부의 경우 urxvt는 예를 들어 수직 커서 이동의 경우 0을 0으로 해석하지만 수평 커서 이동의 경우에는 해석하지 않습니다(1입니다). 내가 확인한 다른 모든 터미널은 이를 1로 해석합니다(xterm을 포함하여 동작과 문서가 일치하지 않습니다).
표준이 일관성이 없습니다. 구현이 일관성이 없습니다.
당신은 무엇을 할 수 있나요? 이것을 사용하지 마십시오. 이러한 오류를 발생시키는 라이브러리를 발견하면 버그를 신고하고 개발자에게 문제가 있는 이스케이프 시퀀스 사용을 중지하도록 요청하십시오. 이는 기대하는 것과 관계없이 일부 표준을 위반하고 일부 터미널을 확실히 손상시킬 수 있기 때문입니다.
답변2
DEC VT의 동작은 ZDM(Zero Default Mode)을 고려하면 이해하기 더 쉽습니다. ECMA-48에서:
매개변수 값 0은 기본 매개변수 값을 나타내며 0과 다를 수 있습니다.
커서 이동 시퀀스의 경우 사양에서는 기본값을 "1"로 정의하므로 이는 ZDM에서도 동일합니다.
CSI A
(매개변수 생략의 기본값은 1입니다.)CSI 0 A
(0은 기본값으로 특별한 의미를 갖습니다)CSI 1 A
(param이 기본값임)
내가 아는 한, DEC 장치에 구현된 모든 CSI 시퀀스는 ZDM 방식을 따릅니다.
ZDM은 나중에 사양에서 제거되었으므로 이제 "0"은 숫자로 읽어야 하며 더 이상 기본값에 대한 특별한 자리 표시자가 아닙니다. 그러나 DEC 장치는 이 동작을 변경하지 않았습니다. 따라서 한 가지 질문으로 귀결됩니다. VT100+ 호환 에뮬레이터가 사양을 완벽하게 준수합니까?