예를 들어 프로그램에서 터미널의 현재 커서 위치를 가져오고 싶습니다.( tput u7
또는 \E[6n
xterm에서):
CSI P s n
P s = 6 → Report Cursor Position (CPR) [row;column] as CSI r ; c R
내 프로그램의 표준 출력에 이 시퀀스를 씁니다. 그 후 표준 입력에 대한 터미널의 응답을 읽었습니다. (tty는 이 시간 동안 원시 모드에 있습니다)
문제는 사용자가 요청을 보낸 직후에 응답을 보내기 전이나 응답 중간에 이스케이프 시퀀스(특정 키를 눌러)나 숫자 또는 기타 항목을 입력하면 어떻게 됩니까? 이 기능은 어떻게 작동하나요? 이 메커니즘에 결함이 있는 걸까요, 아니면 제가 뭔가를 놓치고 있는 걸까요?
답변1
터미널에서 커서 위치와 키보드 입력을 모두 보고합니다. 터미널이 이러한 이스케이프 시퀀스를 수신하면 버퍼링된 키보드 입력을 보내기 전에 이를 해석해야 합니다. 키보드 입력은 커서 위치가 전송된 후에만 프로그램으로 전송되어야 합니다. 여기 있는 모든 터미널이 작동할지 여부는 말할 수 없습니다. 터미널에 클라이언트 소프트웨어가 있으면 이를 제어할 수 없습니다.