저장 후 커서 위치 복원

저장 후 커서 위치 복원

간단한 방법을 통해 커서 위치를 저장하고 복원할 수 있어야 합니다.ANSI 이스케이프 시퀀스

ANSI 이스케이프 시퀀스를 사용하면 화면에서 커서를 자유롭게 이동할 수 있습니다. 이는 쉘 스크립트로 생성된 전체 화면 사용자 인터페이스에 더 유용하지만 프롬프트에서도 사용할 수 있습니다. 모션 이스케이프 시퀀스는 다음과 같습니다.

  • [...]
  • 커서 위치 저장:\033[s
  • 커서 위치 복원:\033[u

원천:Bash 프롬프트 HOWTO: 커서 이동

그러나 이 ANSI 시퀀스는 커서의 수평 위치만 복원하는 것으로 보입니다. 예를 들어:

$ printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'
Doing some task...

More text
                  done!


$

수평은 done!올바른 위치에 있지만 수직은 올바르지 않습니다(복구 측면에서 정확함).

  1. 내가 뭐 놓친 거 없니? 이것을 재현할 수 있나요? !
  2. 이것이 예상되는 동작입니까? 그렇다면 done!나중에 어떻게 인쇄 합니까 task...?
  3. 이런 일이 발생하지 않으면 내 환경의 무언가에 의해 이 동작이 간접적으로 발생할 수 있습니까?

많은 질문을 검색하고 읽었지만 제가 경험한 이러한 행동에 대한 정보를 찾지 못했습니다. 실제로 tputvia에서도 같은 일이 발생합니다.

$ printf 'Doing some task...'; tput sc; printf '\n\nMore text\n'; tput rc; printf 'done!\n\n\n'

답변1

내가 뭐 놓친 거 없니? 이것을 재현할 수 있나요? !

내가 터미널 맨 아래에 있고 콘텐츠의 다음 줄이 위로 이동하면 할 수 있습니다. 그러나 터미널에서 테스트를 반복하십시오.스크롤 없음동시에. Ctrl+ L(또는 전화 )를 클릭 clear하고 맨 위에서 시작합니다. 그러면 원하는 대로 작동할 것입니다.

이것이 예상되는 동작입니까?

그렇게 생각해요. 커서 위치는 화면 내용이 아니라 화면을 기준으로 합니다.

done!나중에 어떻게 인쇄하나요 task...?

가능한 접근 방식: 6줄 이하로 인쇄하고 터미널이 충분히 큰 경우 먼저 6줄의 빈 줄을 인쇄하여 먼저 스크롤한 다음 의미 있는 텍스트를 인쇄하기 전에 커서를 위로 이동합니다.

printf '\n\n\n\n\n\n'; printf '\033[6A'; printf 'Doing some task...\e[s\n\nMore text\n\e[udone!\n\n\n'

논리를 보여주기 위해 세 개의 개별 s를 사용했지만 printf하나일 수도 있습니다.

답변2

나를 위해 작동합니다. 나는 사용하는 것을 선호한다용어 정보 데이터베이스( man 5 terminfo)는 하드 코딩된 이스케이프 시퀀스 대신 사용됩니다.

sc=$(tput sc) rc=$(tput rc) el=$(tput el)
clear; printf 'Doing some task...%s\n' "$sc"; sleep 1; printf '%sDONE%s\n' "$rc" "$el"

현재 커서 위치를 저장/복원하는 것보다 더 나은 옵션인 경우 커서를 절대 위치(왼쪽 위 모서리의 {0,0})로 이동할 수도 있습니다.

tput cup 4 40; sleep 1; printf "%s\n" 'This is row 4 column 40'

관련 정보