请参阅下面的编辑,这并不完全重复Shell 提示符自定义和 cmd 行为
我的reverse-search
CLI 功能坏了,我不知道如何修复它......
当我按下 ctrl+r 并搜索我之前执行的命令,找到它然后按右箭头键使用它时,输出被破坏。以下是一个例子:
# I reverse-searched the word "test" then pressed right arrow
yoshiji@x1carbon:~/path/to/git/folder (master) $ch)`test': rake test
# ^^^^^^^^^^ weird output
# ^ cursor right there
它还会将我的光标“移动”到不同的位置。如果我按下 Enter 键,则会执行正确的命令(rake test
在本例中),这意味着显示的文本与实际执行的文本不同。
我知道这很可能与我的PS1
导出有关~/.bashrc
,所以这里是该文件的最后几行:
# Git branch in prompt.
git_branch() {
branch=$(__git_ps1 2> /dev/null)
if [ "$branch" = " (master)" ]; then
echo -e "\033[33m${branch}\033[00m" # yellow
elif [ "$branch" = "" ]; then
echo -e "\033[90m (no git)\033[00m" # red
else
echo -e "\033[32m${branch}\033[00m" # green
fi
}
PS1='\u@\h:\w$(git_branch) \$ '
这是我编写的内容,用于以橙色显示 git 分支(如果是master
分支)否则以绿色显示(或no git
灰色)。
你们知道是什么导致了这种奇怪的行为吗?
编辑:这与可能重复echo -e "some string"
我正在使用从函数中返回具有 git 分支的颜色+名称的字符串的方式git_branch()
。使用echo -e
不会转义字符\[
和\]
(请在 CLI 中自行尝试echo -e "\[\033[33m\]test"
:)。
理想情况下,我想根据分支的存在和名称保留这些条件颜色(如果没有分支则为灰色,如果是主分支则为橙色,否则为绿色)。
答案1
将颜色序列包装在 readline 转义符中,如下所示:
echo -e "\001\033[33m\002${branch}\001\033[00m\002" # yellow
echo -e "\001\033[90m\002 (no git)\001\033[00m\002" # red
echo -e "\001\033[32m\002${branch}\001\033[00m\002" # green
readline 转义位于\001
非打印序列的开头和\002
结尾。它们分别相当于PS1 字符串中的\[
和。\]
来源:archemiro 的回答在bash 提示和函数内部回显颜色_bash_帮酷编程问答
这是我在另一个问题中的回答代码已改变。
答案2
当你在提示符中添加颜色代码时,你必须添加额外的标记,以便让终端知道提示符中有不可见的字符
改变
echo -e "\033[33m${branch}\033[00m" # yellow
到
echo -e "\[\033[33m\]${branch}\[\033[00m\]" # yellow
# .......^^........^^.........^^........^^
等等
看控制提示在 bash 手册中。