
질문은 여기에 있습니다 :
- https://serverfault.com/questions/152310/reverse-bash-console-text-flow
- https://superuser.com/questions/719317/can-i-reverse-the-stream-direction-of-my-terminal
- https://askubuntu.com/questions/431873/terminal-with-output-scrolling-down
이 변경 사항을 실제로 구현하려면 어떤 라이브러리/프로그램을 조사해야 합니까? 터미널 버퍼에 새 줄을 추가하는 동작을 담당하는 '터미널 스택' 부분은 무엇입니까?
나는 그것이 터미널 소스 코드와 셸 내에 있을 것이라고 생각했는데 지금은 아마도 VTE인 것처럼 보입니까?
어떤 조언이 있습니까?
답변1
터미널 에뮬레이터는 동일하게 구현되지 않습니다. 변경해야 할 사항은 수정하려는 터미널 에뮬레이터에 따라 매우 구체적으로 달라집니다.
일반적으로 이는 두 가지 위치에서 구현될 수 있습니다. 인쇄 및 제어 시퀀스를 터미널 표시 상태의 메모리 내 표현 형식에 대한 수정으로 해석하고 실행하는 에뮬레이션 부분이나 해당 표시 상태를 렌더링하는 실현 부분입니다. 일종의 출력 장치에.
전자는 매우 복잡한 작업이 될 것입니다. 전체 화면 텍스트 사용자 인터페이스를 제공하는 것과 편집 가능한 한 줄만 제공하는 것과 같은 기능을 수행하는 응용 프로그램 소프트웨어는진행방향. 그들은 ␊
, ␈
, ␌
, ␋
, RI
, IND
, CUD
, CUU
등 의 방향과 같은 모든 종류의 것을 가정합니다 . (이론적으로 ECMA-48:1991 규격 장치에서는 라인 진행 방향과 암시적 이동 방향을 전환할 수 있습니다. 실제로 이것을 구현하는 Unix나 Linux 터미널 에뮬레이터는 없는 것으로 알고 있습니다. 세계는 대부분 이것이 't.) 결국, 나는 다양한 결과와 연쇄 효과를 통해 후자의 방법을 어렵게 구현했음을 발견하게 될 것이라고 생각합니다.
후자는 비교적 쉬운 작업이기 때문입니다. 재미삼아 방금 터미널 에뮬레이터에서 구현했습니다. 이는 두 실현자의 부울 플래그에 대한 명령줄 스위치와 여러 위치에서 좌표 변환을 수행하는 일부 조건식이었습니다. 물론, 눈에 보이는 실현 창은 항상 해당 실현기의 문자 셀 크기의 정수배이므로 일부 추가 복잡성을 피할 수 있습니다.
즉, 그것을 사용하고 수년간 위에서 아래로 읽는 습관과 싸웠고,초기의작은 것을 기대하는 애플리케이션의 문제(예: 가난한 사람의 캐럿)위로화살표와 물결표는 가난한 사람의 밑줄임) 그런 다음 매뉴얼 페이지에 주의 사항을 표시했습니다. 나는 사람들이 지금부터 실제로 터미널에서 잘못된 길을 시도하고 그들이 그렇게 한다는 결론에 도달할 수 있도록 다음 릴리스에 메커니즘을 남겨 두는 것을 고려하고 있습니다.~ 아니다결국 그들이 주장한 것에도 불구하고 이것을 원합니다. ☺
추가 읽기
- 조나단 드 보인 폴라드.
console-termio-realizer
. nosh 도구 세트 매뉴얼 페이지. 소프트웨어. - 조나단 드 보인 폴라드.
console-fb-realizer
. nosh 도구 세트 매뉴얼 페이지. 소프트웨어. - https://unix.stackexchange.com/a/289871/5132
답변2
이것은정확한당신이 달성하고 싶은 행동은 무엇입니까?
먼저 나는 당신이 갖고 싶어한다고 가정합니다모두줄을 역순으로항상.
제 생각에는 대부분의 경우 이로 인해 매우 특이하고 직관에 반하는(직접 깨지지는 않은 경우) 동작이 발생하며 아마도 곧 사용을 포기하게 될 것입니다.
cat
텍스트 파일을 읽으면 일반적으로 텍스트를 읽는 방향이 아닌 아래에서 위로 줄이 표시됩니다. 즐겨 사용하는 텍스트 편집기와 뷰어에서는 줄도 반전됩니다. 애플리케이션에서는 상단 표시줄이 하단에 있고 하단 표시줄이 상단에 있습니다. alsamixer에서는 볼륨 컨트롤이 상단에 매달려 있습니다. 상자 그림 문자(예: alsamixer, Midnight Commander 등)가 모서리에서 무너졌습니다. 위쪽 및 아래쪽 키는 많은 앱에서 커서를 반대 방향으로 움직였습니다.
이는 선호하는 터미널 에뮬레이터의 소스(또는 GNOME 터미널과 같은 VTE 기반 에뮬레이터를 사용하는 경우 VTE)를 수정하여 달성할 수 있습니다.
기본적으로 터미널 에뮬레이터는 논리적 내용(어떤 문자 셀에 어떤 그래픽 속성이 포함된 문자가 포함되어 있는지)을 추적하고 이를 사용자가 볼 수 있는 픽셀(잘 렌더링된 문자 모양)로 변환합니다. 이것은 거꾸로 진행되어야 합니다. 문자 기반 좌표와 픽셀 기반 좌표 사이의 변환이 일어나는 곳, 즉 셀 높이의 곱셈이나 나눗셈이 일어나는 모든 곳을 찾습니다. 이러한 공식은 조정되어야 합니다. 예를 들어, 가 보이면 y_pixel = top_padding + row * cell_height
아마도 y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height
, 또는 이와 유사한 것이 될 것입니다.
VTE에서는 매우 부드러운 스크롤(터치패드를 사용한 픽셀별 스크롤)과 추가 하단 패딩(그리드가 정렬되지 않은 경우, 예를 들어 최대화된 창)이 부드러운 스크롤 시 콘텐츠로 채워지는 방식으로 인해 추가적인 두통이 발생합니다.
기본 렌더링을 완료한 후에는 앱으로 전송되는 마우스 이벤트가 올바르게 뒤집혔는지 확인해야 하며, 선택을 추적하는 마우스 이벤트도 마찬가지입니다. 스크롤바도 뒤집어야 합니다.
두 번째 단계로 메뉴 항목을 추가하거나 표준과 거꾸로 된 동작 사이를 전환할 수 있는 새로운 사용자 정의 이스케이프 시퀀스(아마 새로운 DEC 개인 번호)를 도입할 수 있습니다. 모드를 변경하면 모든 것(모든 화면 콘텐츠 및 기록)이 즉시 뒤집어지거나 뒤집어집니다. 원래 동작을 복원할 수 있으면 편리합니다. 특히 선호하는 편집기 앞의 래퍼 스크립트에서 자동으로 수행할 수 있는 경우 더욱 그렇습니다. VTE 및 VTE 기반 에뮬레이터의 경우 그래픽 메뉴 항목에는 두 구성 요소 사이에 새로운 API가 필요하므로 대신 이스케이프 시퀀스를 사용해야 하는 또 다른 이유입니다.
예를 들어 명령 순서가 "거꾸로"인 반면 각 명령의 출력은 "정상" 순서로 표시되는 것과 같이 이보다 더 세밀한 것을 원하는 경우 에뮬레이터에서는 수행할 수 없는 훨씬 더 복잡한 이야기가 됩니다. 자체적으로 어떤 논리적 부분을 뒤집을지 알기 위해서는 (새로 설계된 이스케이프 시퀀스를 통해) 도움을 받아야 합니다. 내 개인적인 추천은 그것을 잊어버리는 것인데, 합리적으로 실행 가능하다고 생각하지 않습니다.