
假設我的提示符號如下所示(_ 代表我的遊標)
~ % _
有什麼辦法可以讓它看起來像這樣
~ % _
[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 的評論改進了腳本。