我正在使用自定义 bash 提示符和这个命令来回答这问题:它看起来像这样:
PS1=$'\e[1;33m\\t \e[36m\u\e[34m@\e[36m\h\e[;1m: \e[34m\w\n \[\b\e[;1;31m✘\] ${?/#0/\[\b\b\e[32m✓ \]}${?/#[1-9]*/ }\[\b→\e[;1m\] \$: \[\e[m\]'
如您所见,红色箭头被截断了,这其实不是问题,但仍然很烦人。无论我使用哪种等宽字体,结果总是截断箭头。
我的初始提示命令如下所示:
set_PS1()
{
local Exit_Code="$?"
local Reset="\\[$(tput sgr0 )\\]"
local Bold="\\[$(tput bold )\\]"
local Red="\\[$(tput setaf 1 )\\]"
local Green="\\[$(tput setaf 2 )\\]"
local Yellow="\\[$(tput setaf 3 )\\]"
local Blue="\\[$(tput setaf 4 )\\]"
local MagentaBG="\\[$(tput setab 5 )\\]"
local Cyan="\\[$(tput setaf 6 )\\]"
local Whoami='\u'
local Where='\w'
local Hostname='\h'
local Time='\D{%H:%M:%S}'
# Emoji are multi-byte, but shells think 1 byte = 1 character
# We add a 1-character space, then enable color-code mode to ignore
# the upcoming emoji, then backspace to draw the emoji on top of the space.
local emoji_start=$' \\[\b'
local emoji_end=$'\\]'
if (($Exit_Code == 0 )); then
local exit_code_prompt="$Green$emoji_start"$'\xE2\x9C\x93'"$emoji_end $emoji_start"$'\xE2\x86\x92'"$emoji_end" # Green checkmark symbol
else
local exit_code_prompt="$Red$emoji_start"$'\xE2\x9C\x98'"$emoji_end $Exit_Code $emoji_start"$'\xE2\x86\x92'"$emoji_end" # Red cross mark symbol and exit code
fi
local Line_1="$Bold$Yellow$Time $Cyan$Whoami$Blue@$Cyan$Hostname$Reset$Bold":" $Blue$Where$Reset"
local Line_2="$Bold$exit_code_prompt $Reset$Bold \\$: $Reset"
#local Line_2="$Bold \$: $Reset"
PS1="$Line_1\\n$Line_2"
}
# We need to expand exit_code_prompt BEFORE PS1 prompt string expansion (see shopt promptvars in man bash)
# so we need to move it to PROMPT_COMMAND which runs earlier.
PROMPT_COMMAND=set_PS1
通过此设置,箭头可以正常显示但当我在装载的物品内时,它不会显示,python venv
这是不行的。因此,我现在使用的是带有截止箭头的简短版本...
更新:
使用字体时,DejaVu Sans Mono
箭头不会被截断。事实上,截断的量会随着所用字体的不同而变化,有些截断量多一些,有些截断量少一些,DejaVu Sans Mono
似乎没有截断,如下所示: