커서 위치를 저장하고 터미널에서 복원

커서 위치를 저장하고 터미널에서 복원

비동기 프롬프트 출력을 생성하기 위해 일부 터미널 기능을 사용하고 있습니다 bash. 나는 다음과 같은 것을 얻고 싶습니다. 에서 문자열을 출력할 때 PROMPT_COMMAND터미널 커서 위치를 저장하고 put을 인쇄 ...하고 다른 작업(예: 다른 정보 인쇄)을 수행한 다음 잠시 후에;돌아가다위치를 기억하고 새로운 것을 인쇄하세요. PS1설계된 방식은 명령 자체를 개행 문자에 배치하여 비동기 출력이 터미널의 텍스트일 뿐이도록 하는 것입니다.

나는 cupterminfo 항목이 커서를 주어진 위치로 이동시키고 현재 위치를 얻기 위한 이스케이프 코드가 있다는 것을 발견했습니다(예를 참조하십시오).이 문제). 하지만 제가 보기에는 모두 터미널 버퍼의 위치가 아닌 화면의 커서 위치를 사용하는 것 같습니다. 이는 새 줄을 추가한 후 내가 기억하는 위치가 잘못된다는 의미입니다.

터미널 커서 위치를 사용하여 버퍼 위치를 기준으로 커서 위치를 저장하고 복원하는 방법이 있습니까? 기억된 위치가 여전히 버퍼의 보이는 부분에 있다고 가정할 수 있지만(실제로 커서를 거기에 놓을 수 있음) 몇 줄 위로 올라갈 수 있습니다. 이제 우리는 경쟁 조건을 고려하지 않습니다. 그렇지 않다면 다른 팁을 찾아보도록 하겠습니다.

실제로 비동기 프롬프트를 지원하는 쉘이 있지만 zsh사용자가 출력하기 전에 새 줄로 이동을 누르면 Enter작동할지 실제로 알 수 없습니다.

답변1

사용할 수 있는 대부분의 터미널은 커서 위치를 저장하고 복원하기 위해 이스케이프 시퀀스를 구현합니다. 이는 터미널 설명의 sc(커서 저장) 및 (커서 복원) 기능 이며 다음과 같이 사용할 수 있습니다.rctputcup

tput sc
tput cup 50 10
echo some stuff
echo more stuff
tput rc

그러나 프로그램이 스크롤을 강제할 만큼 충분한 텍스트를 작성하는 경우 복원된 위치는 여전히 터미널 화면의 동일한 위치에 있습니다. 스크롤되는 텍스트와 함께 움직이지 않습니다.

그런데, POSIX 문서에만 해당부분tput이 도구는 실제로 다른 표준인 X/Open Curses의 일부이기 때문입니다 . 이는 다음에 요약되어 있습니다.이식성매뉴얼 페이지의 일부.

질문으로 돌아가기: 추적되지 않은 이스케이프 시퀀스완충기위치(스크롤 고려). 이렇게 하려면 애플리케이션이 화면에 전송된 내용을 추적해야 합니다. 이런 종류의 문제를 해결하는 것이 저주 라이브러리의 목적입니다. 일반적인 명령줄 응용 프로그램에서는 할 수 있는 일이 많지 않습니다.

관련 정보