[CSI Sequence] 화면 지우기

오늘은 지난 글에 이어서 CSI Sequence를 이용해 화면을 지우는 방법을 알아보도록 하겠다. CSI Sequence에는 화면을 지우는 시퀀스가 2개 있다.

첫 번째는 EL이라고 불리는 Erase in Line 시퀀스다. CSI # K로 구성된 시퀀스로 이름 그대로 줄을 지우는 데 사용되는데, #을 주지 않으면 기본값은 0으로 처리되며, 값을 준다면 0, 1, 2 총 세개중 하나를 줘야 한다. 이외의 값이 오는 경우 시퀀스 자체가 무시된다. 예를 들어 0x311b5b334b32 즉, 1^[3K2같은 값을 출력하면 ^[3K는 무시되고 화면에 12만 출력된다. 0, 1, 2의 동작은 정리하면 다음과 같다.

0
커서부터 줄 끝까지 지운다.
1
줄 시작부터 커서까지 지운다.
2
커서의 위치와 상관 없이 줄 전체를 지운다.

주의할 점은 EL 시퀀스는 커서의 위치를 옮기지 않는다는 것이다. 즉, 지금 쓴 줄을 지우고 새로운 줄을 쓰고 싶으면, EL 시퀀스와 캐리지 리턴(\r)을 같이 사용해줘야 한다.

두 번째는 ED라고 불리는 Erase in Display 시퀀스다. CSI # J로 구성된 시퀀스로 이름 그대로 화면을 지우는 데, EL과 마찬가지로 #의 값에 따라 화면의 어디를 지울지를 결정한다.

0
커서를 기준으로 화면 끝까지 지운다.
1
화면 시작부터 커서까지 지운다.
2
커서의 위치와 상관 없이 화면 전체를 지운다.
3
스크롤 버퍼에 저장된 라인을 지운다,

기본적으로 EL과 같은 느낌이다. 기본값이 0인 것도 같고, 커서의 위치를 옮기지 않는 것도 같고, 정해진 값 이외의 값이 들어오면 무시하는 것도 같다. 단 하나의 차이는 EL에 없는 3이 추가된 것이다.

이 시퀀스는 스크롤 버퍼에 저장된 값을 지우는 시퀀스다. 원래 VT100 시절에 있던 시퀀스는 아니다. 그 시절 터미널에는 스크롤이라는 개념이 없었다. 이 시퀀스는 X 윈도우 시스템과 함께 등장한 터미널 에뮬레이터인 xterm이 나온 뒤 추가 된 시퀀스다. 그래서 과거에는 이를 지원하지 않는 터미널 에뮬레이터도 많았지만, 이것도 다 과거의 이야기고 이제는 대부분의 환경에서 CSI 3 J까지 문제 없이 지원한다.

ED나 EL은 작정하고 TUI를 사용하지 않는 경우 직접 사용할 일은 거의 없다. 이들은 근본적으로 터미널을 컨트롤하는 시퀀스고, 우리가 작성하는 프로그램은 터미널을 제어하는 것이 목적이 아니기 때문이다. 하지만 우리는 우리가 모르는 사이 매일같이 ED를 사용하고 있다. 다음 글은 이에 대해 자세히 알아보도록 하겠다.

댓글

이 블로그의 인기 게시물

Escape Codes의 역사

RAII는 무엇인가

[C++] enum class - 안전하고 쓰기 쉬운 enum

[MongoDB] ObjectId에 대해서

[Python] cache 데코레이터로 최적화하기