터미널 응답과 사용자 입력을 구별하는 방법은 무엇입니까?

터미널 응답과 사용자 입력을 구별하는 방법은 무엇입니까?

예를 들어 프로그램에서 터미널의 현재 커서 위치를 가져오고 싶습니다.( tput u7또는 \E[6nxterm에서):

CSI P s n

P s = 6 → Report Cursor Position (CPR) [row;column] as CSI r ; c R

내 프로그램의 표준 출력에 이 시퀀스를 씁니다. 그 후 표준 입력에 대한 터미널의 응답을 읽었습니다. (tty는 이 시간 동안 원시 모드에 있습니다)

문제는 사용자가 요청을 보낸 직후에 응답을 보내기 전이나 응답 중간에 이스케이프 시퀀스(특정 키를 눌러)나 숫자 또는 기타 항목을 입력하면 어떻게 됩니까? 이 기능은 어떻게 작동하나요? 이 메커니즘에 결함이 있는 걸까요, 아니면 제가 뭔가를 놓치고 있는 걸까요?

답변1

터미널에서 커서 위치와 키보드 입력을 모두 보고합니다. 터미널이 이러한 이스케이프 시퀀스를 수신하면 버퍼링된 키보드 입력을 보내기 전에 이를 해석해야 합니다. 키보드 입력은 커서 위치가 전송된 후에만 프로그램으로 전송되어야 합니다. 여기 있는 모든 터미널이 작동할지 여부는 말할 수 없습니다. 터미널에 클라이언트 소프트웨어가 있으면 이를 제어할 수 없습니다.

답변2

내 테스트에 따르면 단일 키 누르기에 적합하게 작동합니다. 그러나 예를 들어 텍스트를 붙여넣으면 hello모든 위치 보고서가 두 번째 문자( e) 뒤에 나타납니다.

예

커서 위치를 요청하기 전에 버퍼링된 모든 입력을 먼저 대기열에 넣어야 한다고 가정합니다.

관련 정보