라벨이 control sequence인 게시물 표시

[CSI Sequence] 커서 옮기기

Code Abbr Name CSI # A CUU CUrsor Up CSI # B CUD CUrsor Down CSI # C CUF CUrsor Forward CSI # D CUB CUrsor Backward CSI # E CNL CUrsor Next Line CSI # F CPL CUrsor Previous Line CSI # I CHT Cursor Horizontal forward Tabulation CSI # Z CBT Cursor Backward Tabulation CSI # G CHA Cursor Horizontal Absolute CSI # ; # H CUP CUrsor Position 오늘은 지난 글에 이어 이번 글에서는 CSI sequence를 이용해 커서를 옮기는 방법에 대해 알아보겠다. 커서를 옮기는 CSI sequence의 종류는 위와 같이 정리할 수 있다. CUU, CUD, CUF, CUB 이들은 각각 CUrsor Up, CUrsor Down, CUrsor Forward, CUrsor Backward의 약자로 이름 그대로 커서를 위, 아래, 앞, 뒤로 이동한다. 인자로는 한 개의 숫자를 받고, 만약 인자가 생략되면 1로 취급된다. 즉, 0x1b[A 는 0x1b[1A 와 같은 의미이다. 이때 CUF나 CUB는 같은 줄 내에서만 움직이며 줄의 시작에서 CUB를 받아도 이전 줄로 움직이지 않고, 줄의 마지막에서 CUF를 받아도 다음 줄로 움직이지 않는다. 이런 동작을 원하면 각각 reverse auto-wrap 모드와 auto-wrap 모드를 켜야 하는데, 이 모드를 지원할지는 터미널별로 다르다. CNL, CPL 이들은 각각 Cursor Next Line, Cursor Previous Line을 의미하며, 커서를 다음 줄 혹은 윗줄로 옮긴다. CUU와 CUD는 커서의 column을 유지한 채 줄을 바꾼다면, CN

CSI Sequence의 구조

^[ [78G|/- ^[ [17;79H\_ ^[ [9;1H ^[ [1P ^[ [79G|( ^[ [11;79H/ ^[ [K 임베디드 프로그래밍을 해본적 있다면, 임베디드 장치의 시리얼 포트를 연결했을 때, 위와 같은 문자열이 전송돼는 것을 보았을 것이다. 여기서 ^[ 로 시작하는 문자열은 ESC ( \0x1b )를 나타내는 특수한 제어문자로, 이 정체불명의 문자열의 정체는 터미널을 제어하는 escape code를 의미한다. escape sequence 중에서 [로 시작하는 시퀀스를 control sequence 혹은 CSI sequence라고 부른다. control sequence를 시작하게 하는 ESC [ 를 CSI (Control Sequence Introducer라고 부르기 때문이다. CSI sequence는 CSI 를 시작으로 @ , ` , 혹은 알파뱃으로 끝나는 일련의 시퀀스로, CSI 와 마지막 문자 사이에 임의의 개수의 파라미터로 구성되는데, 이때 파라미터는 ASCII로 정의 된 0 ( 0x30 )- 9 ( 0x39 )로 표현되며, 파라미터 사이는 ; ( 0x59 )로 구분된다. 즉, 위의 예제에서 ^[ [78G 는 숫자 78을 파라미터로 받는 G로 끝나는 CSI sequence를 의미하고, ^[ [17;79H 는 숫자 17과 79를 파라미터로 받는 H로 끝나는 CSI sequence를 의미한다. 이번 글에서는 ESC(0x1b)로 시작하는 CSI sequence의 개념과 기본적인 구조에 대해 살펴보았다. CSI sequence는 터미널의 커서 위치, 색상, 속성 등을 제어한다. 이를 활용하여 터미널에서 다양한 동작을 수행하는 프로그램을 개발할 수 있다. 다음 글에서는 CSI sequence의 종류와 각각의 기능에 대해 자세히 설명해보겠다.

이 블로그의 인기 게시물

Escape Codes의 역사

RAII는 무엇인가

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

[MongoDB] ObjectId에 대해서

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