我有一些自定义代码可以调整我的提示符,使其显示如下:
(git-branch):~/t/r/u/ncated-dir$
有时候当我在终端中使用箭头键滚动以前的命令时,提示符会捕获 ~6-7 个字符并将其附加到提示符后面。
问题如下所示:
(master):~/p/test$ <scroll up/down through commands here>
变成这样:
(master):~/p/test$ git pus<keep scrolling up/down through commands here>
这会导致一个类似于这样的提示,当我完成时:
(master):~/p/test$ git puscd public/app/css
(master):~/p/t/p/a/css$
很明显,它并不会影响或破坏执行,但仍然很烦人。
我的.bash_profile看起来像这样:
source "$HOME/bin/git-prompt.sh"
source "$HOME/bin/truncate.sh"
PS1="\$(git_prompt)" # prints current branch
PS1+="\[$COLOR_WHITE\]:\[$COLOR_BLUE\]\$(truncate)" # directory path
PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\] " # '#' for root, else '$'
export PS1
我认为git-prompt.sh
可能是问题所在,因为每当我在.bash_profile
中注释掉那一行时,问题就消失了。但我无法弄清楚为什么。它不应该运行(或改变PS1)直到我按下enter。所以我不知道为什么提示符上会出现幽灵命令。
#! /bin/bash
COLOR_RED="\033[1;31m"
COLOR_YELLOW="\033[1;33m"
COLOR_GREEN="\033[1;32m"
export COLOR_GREY="\033[1;90m"
export COLOR_BLUE="\033[1;34m"
export COLOR_WHITE="\033[0;37m"
export COLOR_RESET="\033[0m"
function git_prompt {
local git_status
local color
git_status="$(git status 2> /dev/null)"
if [[ $git_status =~ "Your branch is ahead of" ]]; then
color="$COLOR_YELLOW"
elif [[ $git_status =~ "Changes not staged for commit" ]]; then
color="$COLOR_RED"
elif [[ $git_status =~ "Untracked files" ]]; then
color="$COLOR_RED"
else
color="$COLOR_GREEN"
fi
local on_branch="On branch ([^${IFS}]*)"
local on_commit="HEAD detached at ([^${IFS}]*)"
local info
if [[ $git_status =~ $on_branch ]]; then
local branch=${BASH_REMATCH[1]}
info="($branch)"
elif [[ $git_status =~ $on_commit ]]; then
local commit=${BASH_REMATCH[1]}
info="($commit)"
else
info="local"
fi
echo -e "${color}${info}"
}
如果需要,
truncate.sh
(连同.bash_profile
和git-prompt.sh
)可以在此 gist中查看。如果最终确定是罪魁祸首,我将编辑代码并加入问题中。但为了简洁起见,我暂时不会提及它。