修复了终端状态行而不是 shell 提示符?

修复了终端状态行而不是 shell 提示符?

在 Unix shell 提示符中填充有用的信息是很常见的,但我有太多想要关注的东西,无法将其全部放入一个提示符中:当前 Gnu 屏幕窗口、当前目录、当前时间、主机名、当前 git 分支,月相,你能想到的。

拥有一个会更理智固定状态地区在终端底部(或顶部)显示所有这些信息,并保留提示。 (我写了“固定状态区域”而不是“固定状态行”,因为我不想将自己限制在一行。)

(当然,该区域不会受到正常交互输出的影响。)

是否有一个标准的 Unix 来实现这样一个固定状态区域,并允许我通过该precmd函数更新它?

答案1

您可以水平分割屏幕screen,将一个区域设置为您想要的大小状态区,并在其中运行一些内容watch -t cat ~/.status,然后将其内容填充~/.status到您的precmd().

答案2

如果您的终端支持终端寻址、保存光标和恢复光标,这可能会起作用:

PS1="$(tput sc;tput cup 0 0;tput rev;tput el)\u@\h \W$( tput rc;tput sgr0)\$ "

但请注意,该命令可能很难编辑,因为 shell 会对它在输入缓冲区中的位置感到困惑。

在中bash,您可以使用反斜杠方括号告诉它忽略光标控制序列:

PS1="\[$(tput sc;tput cup 0 0;tput rev;tput el)\]\u@\h \W\[$( tput rc;tput sgr0)\]\$ "

如果这不起作用,请尝试将输出直接发送到终端:

TOSL=$(tput sc;tput cup 0 0;tput rev;tput el)
FROMSL=$(tput sgr0; tput rc)
PS1='$(echo -n "$TOSL $LOGNAME@$HOSTNAME ${PWD/#$HOME/~}$FROMSL">/dev/tty)\$ '

答案3

今年 [2023],即你提出问题十年后,有一天我感到无聊,写了一篇名为“Basta”(Bash 状态行)的小东西。

https://www.kylheku.com/cgit/basta/about/

它是您从~/.bashrc文件中获取的小脚本,它在屏幕底部为您提供受保护的状态行,显示日期、时间、主机和工作目录(如果需要,可以缩写以适应)。

当 Bash 等待输入时,时间会更新!

答案4

AT&T Unix 有sysline命令,它为硬件中没有命令的终端提供状态行。也许现在已经有一个 GNU 等价的东西了......

相关内容