터미널 창의 너비가 80열이고 다음만 포함하는 Python 스크립트를 실행한다고 가정합니다.
print("x" * 81 + "\b\by")
출력은 x
마지막 줄을 제외하고는 으로 가득 찬 줄이 될 것으로 예상할 수 있습니다 y
. 내 문제는 내가 얻는 출력이 가득 찬 줄 x
과 lonely 를 포함하는 두 번째 줄이라는 것입니다 y
. 사실 백스페이스 문자가 stdout에 인쇄될 때마다 줄 바꿈된 줄이 있고 커서를 한 줄 위에 배치해야 하는 경우를 제외하고는 예상대로 작동합니다. 이 경우 stdout 버퍼에서 제외된 것처럼 보입니다.
위의 코드 내용을 따라 여러 가지 방법으로 이 동작을 재현할 수 있습니다. 예를 들어 C/C++의 경우 echo -e "xx...x\b\by"
bash 및 sh를 사용해 시도하고 C++의 경우도 있습니다. 백스페이스 문자가 포함된 파일과 둘 이상의 터미널 창 라인을 사용하는 stdin 읽기를 입력할 때에도 동일한 문제가 발생합니다 . 후자의 경우 백스페이스 키를 여러 번 누르면 문자가 대체됩니다. 창 너비를 초과하고 줄바꿈을 하면 백스페이스를 반복적으로 눌러 이전 줄에 도달할 수 없지만 해당 적중은 호출 프로그램에서 예상한 대로 처리됩니다. 예를 들어 호출 시 위의 예에 따라 79 및 1 이 포함됩니다 . 여기서 재미있는 점은 새 커서 위치가 더 이상 창의 첫 번째 열에 있지 않도록 창 크기를 조정하면 새로운 첫 번째 열 위치로 다시 백스페이스하여 다음 단계까지 계속 진행할 수 있다는 것입니다. 터미널 라인이 남았습니다. 그러다가 더 이상 백스페이스할 수 없는 위치가 있다는 것이 밝혀졌습니다. 하지만 그 위치를 예측하는 방법을 알 수 없었습니다.printf(...);
cout << ...;
cat
'\b'
scanf("%s", s);
s
x
y
마지막으로 줄 바꿈과 백스페이스가 만나는 또 다른 상황은 긴 명령을 입력하고 첫 번째 줄로 백스페이스하려는 경우입니다. 나는 그렇게 하는 데 아무런 문제가 없습니다.
저는 Ubuntu 18.04를 사용하고 있으며 다양한 터미널 에뮬레이터, 즉 gnome-terminal, xvt 및 tilda를 사용하여 위의 모든 것을 시도했습니다. 어떤 힌트라도 정말 감사하겠습니다. 감사해요!
답변1
tmux
, screen
, urxvt
원하는 대로 행동하세요. xterm
활성화하여 해당 동작으로 전환할 수 있습니다.역방향 순환 모드: printf '\e[?45h'
.
그것은 유산이고 실제로 설계상 깨졌기 때문에 아무도 그것을 고치려고 하지 않았습니다. 지적하신 것보다 더 많은 문제가 있습니다. 보다VTE 문제 62자세한 내용은
긴 명령을 입력하고 첫 번째 줄로 다시 돌아가려고 할 때. 나는 그렇게 하는 데 아무런 문제가 없습니다.
이 경우 백스페이스를 내보내는 것보다 더 복잡한 화면 처리를 수행하는 쉘의 줄 편집(예: readline 라이브러리)을 사용하고 있습니다.
답변2
윈도우 7 파이썬 3.7.4
print("x" * 81 + "y")
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
너가 원하는게 그거야?