如何在底部有提示的情况下启动 XTerm?

l0b*_*0b0 14 bash terminal xterm

启动 XTerm 时,提示从终端的第一行开始。运行命令时,提示会向下移动,直到到达底部,然后它就停留在那里(甚至Shift-Page Down或者鼠标可以改变它)。而不是让终端生命周期的开始是“特殊的” ,提示应该总是在终端的底部。请注意,我有一个多行提示

当然,它应该像以前一样工作(可调整大小,可滚动,输出中没有不必要的换行符,并且没有输出神秘消失),所以PROMPT_COMMAND='echo;echo;...'或类似的不是一个选项。理想情况下,解决方案不应该是特定于 shell 的。

编辑:目前的解决方案,在简单的情况下工作时,有几个问题:

  • 这是Bash 特定的。理想的解决方案应该可以移植到其他 shell。
  • 如果其他进程修改失败PS1。一个例子是的virtualenv,这增加了(virtualenv)开始PS1,然后总是消失只是倍以上。
  • Ctrl-l现在删除历史的最后一页。

除了分叉 XTerm 之外,有没有办法避免这些问题?

cel*_*chk 12

如果使用bash,以下应该可以解决问题:

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"
Run Code Online (Sandbox Code Playgroud)

或者(效率较低,因为它tput在每个提示之前运行一个命令,但在调整终端窗口大小后工作):

PS1='\[$(tput cup "$LINES")\]'$PS1
Run Code Online (Sandbox Code Playgroud)

为了防止tput更改退出代码,您可以显式保存并重置它:

PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1
Run Code Online (Sandbox Code Playgroud)

注意变量retval是局部的;它不会影响retval您可能在 shell 中以其他方式定义的任何变量。

由于大多数终端cup功能相同\e[y;xH,您也可以对其进行硬编码:

PS1='\[\e[$LINES;1H\]'$PS1
Run Code Online (Sandbox Code Playgroud)

如果您希望它不会在以后重置 PS1 时安全,您也可以使用该PROMPT_COMMAND变量。如果设置,则输出提示之前作为命令运行。所以效果也可以通过

PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'
Run Code Online (Sandbox Code Playgroud)

当然,虽然重置PS1不会影响这个,但其他一些软件也可能会改变PROMPT_COMMAND