我的光标位于 bash 提示符的开头。知道原因吗?

我的光标位于 bash 提示符的开头。知道原因吗?

我正在使用 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:我不确定我的实际颜色编号是否正确。

相关内容