我有一个非常烦人的问题。我遵循了制作 bash PS1 的所有协议。我知道用\[
and\]
或\001
and包围不可打印的字符\002
;但是,我对出现的文本有疑问后光标所在的位置。当你按下退格键时,一切都会消失。
看一下 bash PS1(将其设为您的 bashrc 并进行测试可能会很有用——请务必保存您的 bashrc 的副本):
## GRML
# grml battery?
GRML_DISPLAY_BATTERY=1
# battery dir
if [ -d /sys/class/power_supply/BAT0 ]; then
_PS1_bat_dir='BAT0';
else
_PS1_bat_dir='BAT1';
fi
# ps1 return and battery
_PS1_ret(){
# should be at beg of line (otherwise more complex stuff needed)
RET=$?;
# battery
if [[ "$GRML_DISPLAY_BATTERY" == "1" ]]; then
if [ -d /sys/class/power_supply/$_PS1_bat_dir ]; then
# linux
STATUS="$( cat /sys/class/power_supply/$_PS1_bat_dir/status )";
if [ "$STATUS" = "Discharging" ]; then
bat=$( printf ' v%d%%' "$( cat /sys/class/power_supply/$_PS1_bat_dir/capacity )" );
elif [ "$STATUS" = "Charging" ]; then
bat=$( printf ' ^%d%%' "$( cat /sys/class/power_supply/$_PS1_bat_dir/capacity )" );
elif [ "$STATUS" = "Full" ] || [ "$STATUS" = "Unknown" ] && [ "$(cat /sys/class/power_supply/$_PS1_bat_dir/capacity)" -gt "98" ]; then
bat=$( printf ' =%d%%' "$( cat /sys/class/power_supply/$_PS1_bat_dir/capacity )" );
else
bat=$( printf ' ?%d%%' "$( cat /sys/class/power_supply/$_PS1_bat_dir/capacity )" );
fi;
fi
fi
if [[ "$RET" -ne "0" ]]; then
printf '\001%*s%s\r%s\002%s ' "$(tput cols)" ":( $bat " "[0;31;1m" "$RET"
else
printf '\001%*s%s\r\002' "$(tput cols)" "$bat "
fi;
}
# ps1 git branch
_PS1_git(){
if ! type 'git' &> /dev/null; then
return 1;
fi;
if [ ! "$( git rev-parse --is-inside-git-dir 2> /dev/null )" ]; then
return 2;
fi
branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"
if [ "$branch" ]; then
printf ' \001%s\002(\001%s\002git\001%s\002)\001%s\002-\001%s\002[\001%s\002%s\001%s\002]\001%s\002' "[0;35m" "[39m" "[35m" "[39m" "[35m" "[32m" "${branch}" "[35m" "[39m"
fi;
}
# grml PS1 string
PS1="\[\e[0m\]\$(_PS1_ret)\[\e[34;1m\]${debian_chroot:+($debian_chroot)}\u\[\e[0m\]@\h \[\e[01m\]\w\$(_PS1_git) \[\e[0m\]% "
你应该看到类似的东西
user@host ~ % █ v87%
你可能看不到v87%
。没关系。您可以这样做Ctrlc,您会在左侧看到一个红色错误代码,:(
在最右侧看到一个。
所以,你会看到
130 user@host ~ % █ :( v87%
或者
130 user@host ~ % █ :(
无论哪种方式,光标右侧都有一些东西。
现在,如果您输入一些内容,然后Backspace,您会看到:(
(也许还有电池信息)消失! (按up然后down会做同样的事情。)
如果你能解决这个问题,你就是我的英雄!这可能不是很容易,但如果有任何聪明的解决方案......地板就是你的。
答案1
不是一个直接的编程答案,但所需的效果可以通过安装来实现液体提示,它可以显示$PS1
电池统计信息以及许多其他类型的有用诊断数据。要调整默认设置,只需安装、运行和编辑自动创建的~/.config/liquidpromptrc
.
主程序liquidprompt_activate
及其调用的脚本都在外壳脚本,使其成为研究其工作方式的绝佳来源。