긴 명령줄( > $COLUMNS )을 자동으로 래핑하는 방법은 무엇입니까?

긴 명령줄( > $COLUMNS )을 자동으로 래핑하는 방법은 무엇입니까?

I/O 전달에는 여러 지점이 있으며 그 중 일부는 (내가 아는 한) 쉘, pty, tty, termios, 터미널 에뮬레이터 애플리케이션입니다. 대부분의 터미널 에뮬레이터에서는 사용자가 Enter 키를 눌러 명령을 제출하기 전에 긴 명령줄(현재 $COLUMNS를 넘어서는 줄)이 줄바꿈됩니다. 또한 예상대로 명령줄에서 적절한 수의 문자가 제거되면 줄이 위 줄로 거꾸로 줄바꿈됩니다.

내 질문은: 이 마법은 일반적으로 어디에서 처리됩니까? 셸의 일부인 termios 설정입니까, 아니면 이를 담당하는 터미널 에뮬레이터 응용 프로그램입니까?

더 자세한 설명을 위해 Ubuntu에서 Terminator 터미널 에뮬레이터 응용 프로그램을 사용하고 있습니다. 여기서 개행 문자는 잘 작동합니다(따라서 $PS1 프롬프트도 괜찮을 것입니다). 하지만 go pty generateer(github.com/kr/pty)와 함께 작동하는 자체 터미널 에뮬레이터 응용 프로그램을 개발 중이며 줄 바꿈이 없지만 줄 시작 부분에 동일한 줄이 있는 긴 줄에 문제가 있습니다. 철사.

답변1

대부분의 터미널 에뮬레이터에서는 사용자가 Enter 키를 눌러 명령을 제출하기 전에 긴 명령줄 [...]이 줄 바꿈됩니다.

이것터미널 에뮬레이터 기능이 아닙니다.

이것은 쉘의 기능입니다. 귀하의 쉘은 전체 화면 응용 프로그램이 아니지만 다음을 수행하고 있습니다.커서 주소 지정.

셸에서 명령줄을 편집할 때 셸의 줄 편집 라이브러리는 편집 중인 줄이 표시되는 방식을 전적으로 담당합니다. Bourne Again 쉘에서 이는 GNU readline 라이브러리입니다. Almquist 쉘은 libedit를 사용합니다. 다른 셸(예: Z Shell)에는 자체 라이브러리가 있습니다.

이러한 라이브러리는 터미널 에뮬레이터의 터미널 기능을 문서화하는 termcap/terminfo 라이브러리 위에 있습니다. 여기에는 커서를 상대적 또는 절대적 위치에 두는 제어 시퀀스, 줄 끝과 화면 끝을 지우는 시퀀스, 터미널에자동 여백.

이것과 터미널 너비에 대한 정보 TIOCGWINSZ ioctl(다른 라이브러리의 경우 termcap/terminfo 데이터베이스로 대체 COLUMNS)를 사용하여 셸의 줄 편집 라이브러리는 명령줄 길이와 줄 수를 추적할 수 있습니다. 터미널 라인에 표시됩니다. 입력 라인을 편집하는 동안 커서를 지능적으로 이동하여 입력 라인을 다시 그립니다. 때로는 자동 마진에 의존할 수도 있습니다(단말기에 있는 경우). 때로는 제어 시퀀스를 사용하여 커서의 위치를 ​​명시적으로 변경할 수도 있습니다.

그렇게 되면 다음과 같은 문제가 발생하게 됩니다.https://superuser.com/questions/695338/. 프롬프트 문자열의 제어 시퀀스가 ​​올바르게 분리되지 않으면 사람들은 커서가 어디에 있는지, 화면의 특정 위치에 쓰려면 어떤 커서 움직임을 내보내야 하는지에 대해 혼란스러운 아이디어를 얻을 수 있습니다.

터미널 에뮬레이터는 명령줄이나 줄 편집 개념을 처리하지 않습니다. 이 레이어의 일부가 아닙니다. 간단한 문자 스트림과 제어 시퀀스를 확인하고 이를 렌더링해야 합니다. 터미널 에뮬레이터는 termcap/terminfo 항목에 광고된 제어 시퀀스를 구현하는 역할을 담당합니다. GNU readline, libedit, ZLE vimscreen은 자신이 찾은 광고 콘텐츠를 사용합니다. 예를 들어 터미널에 자동 여백이 있다고 termcap/terminfo에서 선언하는 경우 에뮬레이터는 문자가 오른쪽 여백에 인쇄될 때 줄 바꿈해야 합니다. 터미널이 커서를 위아래로 움직일 수 있다고 명시한 경우 적절한 제어 시퀀스를 수신하면 실제로 그렇게 해야 합니다.

참고: GNU readline이 termcap/terminfo 항목에 그렇게 할 방법이 없다고 되어 커서를 위로 이동할 수 없다는 것을 발견하면 실제로 개행 문자가 전혀 표시되지 않습니다. readline은 입력 줄을 모두 한 줄에 수평으로 스크롤하는 모드로 돌아갑니다.

답변2

터미널 [에뮬레이터]가 이를 담당합니다. 다음 행의 첫 번째 열로 이동하는 것은 행의 마지막 위치를 채운 후 터미널이 수행하는 작업과 정확히 같습니다.

cat긴 줄을 입력하고 입력하면 이것이 쉘이 수행하는 작업이 아니라는 것을 쉽게 알 수 있습니다. 쉘은 터미널에 있다고 생각 bash되는 zsh커서 위치와 열 수를 추적하고 줄 끝에서 다양한 터미널 제어 시퀀스를 출력하지만 이는 고급 줄 편집 기능 중 일부를 구현할 수 있도록 하기 위한 것입니다( 예를 들어 오른쪽 프롬프트, 가로 스크롤, 탭 완성 메뉴 표시 및 지우기, 현재 줄 다시 쓰기/새로 고침 등...) 그렇지 않으면 줄 바꿈이 계속 발생합니다.

tty 레이어는 화면 크기에 대해서도 알 수 있지만 줄바꿈이 발생하는지 확인하는 데는 사용되지 않습니다.

터미널이 이 작업을 수행하지 않으면 터미널에 버그가 있는 것입니다.

관련 정보