我正在使用 Gary Bernhardt (destroyallsoftware.com) 的 .bashrc 的稍微修改版本和 homebrew bash 3.2.51。
# . ~/bin/bash_colors.sh
. ~/bin/colorize.sh
[... snipped ...]
# Git prompt components
function minutes_since_last_commit {
now=`date +%s`
last_commit=`git log --pretty=format:'%at' -1`
seconds_since_last_commit=$((now-last_commit))
minutes_since_last_commit=$((seconds_since_last_commit/60))
echo $minutes_since_last_commit
}
grb_git_prompt() {
local g="$(__gitdir)"
if [ -n "$g" ]; then
local MINUTES_SINCE_LAST_COMMIT=`minutes_since_last_commit`
if [ "$MINUTES_SINCE_LAST_COMMIT" -gt 30 ]; then
local COLOR=${txtred}
elif [ "$MINUTES_SINCE_LAST_COMMIT" -gt 10 ]; then
local COLOR=${txtylw}
else
local COLOR=${txtgrn}
fi
local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)${reset}"
# The __git_ps1 function inserts the current git branch where %s is
# *** richard -- added purple to branch name
local GIT_PROMPT=`__git_ps1 "[\033${txtgrn}%s\033${reset}|\033${SINCE_LAST_COMMIT}]"`
echo ${GIT_PROMPT}
fi
}
PS1="\[${txtblu}\u\[${txtmag}@\h\[${reset}:\[\W\]\[\$(grb_git_prompt)\$ "
[... snipped ...]
由于某种原因,我的提示是这样的:
直到我这样做:
$ bash
此时它会这样做:
这个完全相同的 .bashrc 和相关脚本在我的 arch box 上完美运行。
$ echo $PS1
\[\u\[@\h\[:\[\W\]\[$(grb_git_prompt)$
Terminal.app 和 iTerm2 中都发生了同样的事情。有什么想法吗?
答案1
在不知道颜色变量的具体内容的情况下,我认为你需要改变这一点
PS1="\[${txtblu}\u\[${txtmag}@\h\[${reset}:\[\W\]\[\$(grb_git_prompt)\$ "
对此
PS1="\[\033${txtblu}\]\u\[\033${txtmag}\]@\h\[\033${reset}\]:\W\$(grb_git_prompt)\$ "
并改变这一点
local SINCE_LAST_COMMIT="${COLOR}$(minutes_since_last_commit)${reset}"
local GIT_PROMPT=`__git_ps1 "[\033${txtgrn}%s\033${reset}|\033${SINCE_LAST_COMMIT}]"`
echo ${GIT_PROMPT}
到
local SINCE_LAST_COMMIT="\[\033${COLOR}\]${MINUTES_SINCE_LAST_COMMIT}\[\033${reset}\]"
echo "$(__git_ps1 "\[\033${txtgrn}\]%s\[\033${reset}\]|${SINCE_LAST_COMMIT}")"
所有颜色代码都必须单独被包围\[...\]
答案2
我怀疑你的颜色定义(我在你的问题中看不到)已经有了周围环境\[
和\]
字符。例如,你的黄色是这样的:
txtylw="\[\033[0;37m\]"
这就是造成混乱和问题的原因。
grb_git_prompt()
PS1 提示需要那些周围的字符,但是函数返回的颜色一定不,因为每次按下时都会调用此函数Enter
,并且它的输出将被插入字面上地进入你的提示。
将这些放在函数的顶部,grb_git_prompt()
看看我是否正确:
local txtred="\033[0;31m"
local txtylw="\033[0;37m"
local txtgrn="\033[0;32m"
local reset="\033[0m"
PS:我不确定我的实际颜色编号是否正确。