하단에 프롬프트로 XTerm을 시작하는 방법은 무엇입니까? 이전과 같이

XTerm을 시작하면 터미널의 첫 번째 줄에서 프롬프트가 시작됩니다. 명령을 바닥에 닿을 때까지 아래로 신속한 이동을 실행 때에 그때부터가 (심지어 유지 ShiftPage Down또는 마우스를 변경할 수 있습니다). 터미널 수명이 “특별”하게되기보다는 프롬프트는 항상 터미널의 맨 아래에 있어야합니다. 나는이 점에 유의하시기 바랍니다 멀티 라인 프롬프트 .

물론 이전과 같이 작동해야합니다 (크기 조정 가능, 스크롤 가능, 출력에 불필요한 줄 바꿈이없고 출력이 신비하게 사라지지 않음). 그렇 PROMPT_COMMAND='echo;echo;...'거나 유사한 옵션은 아닙니다. 이 솔루션은 이상적으로 쉘 전용이 아니어야합니다.

편집 : 현재 솔루션은 간단한 경우에서 작업하는 동안, 몇 가지 문제가 있습니다 :

  • 그것은이다 배쉬 특정 . 이상적인 솔루션은 다른 쉘에 이식 가능해야합니다.
  • 그것은 다른 프로세스 수정하면 실패합니다PS1 . 예를 들어 virtualenv (virtualenv)시작 부분 에 추가 되며 PS1접힌 부분 바로 위에서 항상 사라집니다.
  • Ctrll이제 기록의 마지막 페이지를 제거 합니다.

XTerm을 분기시키지 않고 이러한 문제를 피할 수있는 방법이 있습니까?



답변

를 사용 bash하는 경우 다음이 트릭을 수행해야합니다.

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

또는 ( tput각 프롬프트 전에 하나의 명령을 실행하므로 효율적이지 않지만 터미널 창의 크기를 조정 한 후에 작동합니다).

PS1='\[$(tput cup "$LINES")\]'$PS1

tput종료 코드를 변경 하지 않으려면 명시 적으로 저장하고 재설정하십시오.

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1

변수 retval는 지역적입니다. retval쉘에서 다르게 정의한 변수 에는 영향을 미치지 않습니다 .

대부분의 터미널 cup기능은 동일 하므로 \e[y;xH하드 코딩 할 수도 있습니다.

PS1='\[\e[$LINES;1H\]'$PS1

나중에 PS1을 재설정하지 않아도 안전하려면 PROMPT_COMMAND변수 를 사용할 수도 있습니다 . 설정된 경우 프롬프트가 출력 되기 전에 명령으로 실행됩니다 . 따라서 효과는

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'

물론 재설정 PS1해도 영향을 미치지 않지만 다른 소프트웨어도 변경 될 수 있습니다 PROMPT_COMMAND.


답변

이전 답변을 약간 단순화하면 다음과 같이 실행하는 것이 더 쉽다는 것을 알았습니다.

tput cup $LINES

의 시작에서 .bashrc또는 .zshrc. 그냥 일을 해요.

장점 :

  • 쉘을 시작할 때 한 번만 인쇄됩니다.

단점 :

  • ^ L로 화면을 지우면 인쇄되지 않으며 앨리어싱 clearclear; tput ...도움이되지 않습니다.
  • 터미널 크기를 조정할 때 프롬프트가 다른 곳으로 이동

답변

사용하는 답변 $LINES은 불필요하게 이식성이 없습니다. 에서와 같이 위치를 임의로 큰 줄 번호로 설정 resize하도록 요청할 수 있습니다 xterm.

tput cup 9999 0

( 스크롤 백을 무시하고 10 만 줄보다 작은 창이 있다고 가정합니다 ).

문자열은 창 크기를 조정하는 부작용으로 변경되지 않으므로이를 한 번 계산하여 프롬프트 문자열에 상수로 붙여 넣을 수 있습니다.

TPUT_END=$(tput cup 9999 0)

그리고 나중에

PS1="${TPUT_END} myprompt: "

당신의 취향에 따라.

다른 프로세스 수정에 관해서는 PS1: PS1변경 후 원하는 대로 다시 계산 해야합니다. 그러나 질문 에서 변경해야 할 부분 을 지적하기에 충분한 세부 정보가 없습니다 .

마지막으로 탭 완성의 동작은 bash의 가정으로 인해 이러한 종류의 변경과 맞지 않습니다.


답변