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


12

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

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

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

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

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


어떻게 든 Xterm의 스크롤바 버퍼에 공백 문자를 도입해야합니다.
SHW

3
실제로 clear명령 을 실행하면 언제든지 프롬프트를 맨 위로 쉽게 이동할 수 있습니다 .
wasdiver

@ SHW 나는 핵이 아닌 이것에 대한 설정이 있기를 바랐다. 터미널 해킹은 내 경험에 매우 미묘한 버그를 일으키는 경향이 있습니다.
l0b0

@werediver 그러나 나는 그것이 위에 있기를 결코 원하지 않습니다 .
l0b0

1
쉘만이 프롬프트를 출력하는시기를 알고 있기 때문에 모든 솔루션은 쉘 컨텍스트에 있어야합니다. XTerm은 출력하라는 메시지가 프롬프트인지 아닌지를 모르기 때문에 XTerm을 포크해도 도움이되지 않습니다. 터미널의 경우 쉘 프롬프트는 다른 문자 순서 일 뿐이며 다른 문자 순서와 다릅니다.
celtschk

답변:


11

를 사용 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많은 echo명령 과 어떻게 다릅니 까? (호기심에서)
SHW

@ l0b0, 아마도 별도의 답변이 필요하지 않습니다. celtschk이 자신의 답변을 편집하지 않아도되기를 바랍니다.
Stéphane Chazelas

'\[$(tput cup "$LINES")\]' 아름답게 작동합니다 . 감사!
l0b0

문제가 있습니다 tput. 재설정하는 것 같습니다 $exit_code. 를 사용하여 수정 했습니다 \[\e[$LINES;1H\].
l0b0

1
@ l0b0 : 이제 tput종료 코드를 유지 하는 버전을 추가했습니다 .
celtschk

4

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

tput cup $LINES

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

장점 :

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

단점 :

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

2

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

tput cup 9999 0

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

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

TPUT_END=$(tput cup 9999 0)

그리고 나중에

PS1="${TPUT_END} myprompt: "

당신의 취향에 따라.

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

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


"탭 완성 동작이 이런 종류의 변화와 맞물리지 않는다"는 것은 무엇을 의미합니까?
l0b0

제 생각 PS1="${TPUT_END} myprompt: "에는PS1="${TPUT_END}${PS1}"
l0b0

후자의 경우-권리 (메이크 파일 생각에서 오타). 전자의 경우, bash의 명령 편집은 행을 다시 인쇄 할 수 있어야하며 (프롬프트 사용) 명령 완료로 인해 스크롤과 결합 할 때 이상한 동작을 얻을 수 있습니다.
Thomas Dickey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.