假设我的提示符如下所示(_ 代表我的光标)
~ % _
有什么办法可以让它看起来像这样
~ % _
[some status]
这个问题最初是关于 zsh 的,但现在有了其他答案。
答案1
以下设置似乎有效。如果命令行溢出第一行,第二行上的文本就会消失。该preexec
函数在运行命令之前擦除第二行;如果你想保留它,请更改为preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
转义记录在 zsh 手册 ( man zshmisc
) 中。
Terminfo是终端访问API。 Zsh 有一个terminfo
模块可以访问终端描述数据库:$terminfo[$cap]
是发送以锻炼终端能力$cap
(即运行其$cap
命令)的字符序列。有关详细信息,请参阅man 5 terminfo
(在 Linux 上,节号可能与其他 unice 不同)。
操作顺序为:将光标向下移动一行 ( cud1
),然后向后移动 ( cuu1
);保存光标位置(sc
);将光标向下移动一行;打印[some status]
;恢复光标位置。仅当提示位于屏幕底行时才需要开始的上下位。 preexec 行会删除第二行 ( el
),以便它不会与命令的输出混淆。
如果第二行的文字比终端宽,则显示可能会出现乱码。必要时使用Ctrl+进行修复。L
答案2
这是bash
Gilles 的 zsh 解决方案的等效方案。 Bash 没有本机 terminfo 模块,但该tput
命令(与 捆绑在一起terminfo
)的作用大致相同。
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
如果终端不支持其中一项功能,它将回退到一行提示。
该trap
行是模拟 zshpreexec
功能的一种巧妙方法。看https://superuser.com/questions/175799/了解更多信息。
编辑:根据 Gilles 的评论改进了脚本。