CLI 中的反向搜索:之后的输出混乱

CLI 中的反向搜索:之后的输出混乱

请参阅下面的编辑,这并不完全重复Shell 提示符自定义和 cmd 行为

我的reverse-searchCLI 功能坏了,我不知道如何修复它......

当我按下 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 手册中。

相关内容