我已经定义了一个 bash 提示(使用 PROMPT_FUNCTION),如下所示:
function get_hg_prompt_prefix() {
local APPLIED_COLOR=$1; shift
local UNAPPLIED_COLOR=$1; shift
local ALERT_COLOUR=$1; shift
local TEXTCOLOR=$1; shift
local mercurial_prompt_line="{{patches|join(:)|pre_applied(${APPLIED_COLOR})|post_applied(${TEXTCOLOR})|pre_unapplied(${UNAPPLIED_COLOR})|post_unapplied(${TEXTCOLOR})}\n\r}"
local mercurial_status_prompt="{ ${ALERT_COLOUR}{status}${TEXTCOLOR}}"
echo "$(hg prompt "${mercurial_prompt_line}" 2>/dev/null)$(hg prompt "${mercurial_status_prompt}" 2>/dev/null)"
}
function set_prompt() {
bright='\[[01m\]'
colors_reset='\[[00m\]'
HOSTCOLOR=${colors_reset}='\[[34m\]'
USERCOLOR=${colors_reset}='\[[01m\]'
TEXTCOLOR=${colors_reset}='\[[32m\]'
APPLIED_COLOR=${colors_reset}='\[[32m\]'
UNAPPLIED_COLOR=${colors_reset}='\[[37m\]'
ALERT_COLOUR=${colors_reset}='\[[31m\]'
hg_status="$(get_hg_prompt_prefix $APPLIED_COLOR $UNAPPLIED_COLOR $ALERT_COLOUR $TEXTCOLOR)"
ps1_prefix="${hg_status}$colors_reset($bright$(basename $VIRTUAL_ENV)$colors_reset) "
PROMPTEND='$'
PS1="${ps1_prefix}${USERCOLOR}\u${colors_reset}${TEXTCOLOR}@${colors_reset}${HOSTCOLOR}\h${colors_reset}${TEXTCOLOR} (\W) ${PROMPTEND}${colors_reset} "
}
PROMPT_COMMAND=set_prompt
Run Code Online (Sandbox Code Playgroud)
一般来说,这给了我一个多行提示,显示一些 hg 状态信息以及我当前的 virtualenv,看起来(没有颜色)是这样的:
buggy-wins.patch
! (saas) user@computer (~) $
Run Code Online (Sandbox Code Playgroud)
问题是,这与提示长度的计算有关(我认为!)并导致奇怪的终端包装问题和光标放置。例如,在一个 80 字符的终端中,这是我看到的提示(** 包围的字符是光标位置):
~) $ **a**nis) crose@chris-rose (~
Run Code Online (Sandbox Code Playgroud)
在足够宽以显示提示的终端中,换行发生的时间比它应该的要早得多;这是我可以在 108 个字符宽的终端窗口中的提示第一行中容纳的最多文本(同样,** 标记了我的光标位置):
**(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff
Run Code Online (Sandbox Code Playgroud)
当该行结束时,它会覆盖提示。然而,输入的第二行直接运行到终端的边缘,然后正确换行。
所以,很明显,提示的宽度有问题。如何让bash不根据ANSI转义码,而是根据提示的实际显示长度来判断PS1字符串的长度?
use*_*686 21
bash
用于\[
\]
确定“显示长度”:这两个转义之间的文本被认为是不可打印的,不计入总长度;其他一切都是。
您的变量似乎存在问题:bright='\[[01m\]'
实际上不包含 ESC 字符,因此[01m
作为普通文本打印但不计入长度。应该是'\[\e[01m\]'
。所有其他变量相同。
有关的:
\$(hg_status)
以$PS1
直接,而不需要单独的PROMPT_COMMAND
。 归档时间: |
|
查看次数: |
4601 次 |
最近记录: |