在shell提示下,在提示下方显示内容?


Answers:


17

以下设置似乎有效。如果命令行溢出第一行,第二行的文本将消失。该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进行紧急维修。


5

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行是一种模仿zsh preexec功能的简单方法。有关更多信息,请参见/superuser/175799/

编辑:基于吉尔的评论的改进脚本。


@吉尔斯:感谢您的输入!我想我现在可以更好地工作了。在gnome-terminal和xterm中尝试了bash 4.1.5,在OSX Terminal中尝试了bash 3.2.48。
詹德(Jander)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.