我有一些自定义代码可以调整我的提示,如下所示:
(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),直到我按输入。所以我不确定我是如何在提示符下获得幽灵命令的。
#! /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}"
}
如果需要,可以查看{p> truncate.sh
(以及.bash_profile
和git-prompt.sh
)in this gist。如果事实证明它是罪魁祸首,我会将代码编辑到问题中。但为了简洁和减少噪音,我现在暂时搁置它。
答案 0 :(得分:3)
Bash对你的提示有多长时间感到困惑。
PS1+="\[$COLOR_WHITE\]\$\[$COLOR_RESET\]
注意上面的颜色是如何被\[
和\]
包围的?这些标记用于界定不会使光标前进的非打印字符。
git_prompt
遗漏了他们。您需要将其拆分为两个功能才能使其正常工作,一个用于颜色,一个用于信息。例如:
PS1="\[\$(git_color)\]\$(git_info)"