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

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

CLI中的reverse-searchfunction被破坏,我不知道如何修复它…

当我按下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 ),这意味着显示的文本与实际执行的文本不同。

我知道这很可能与我的~/.bashrc 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_branch()返回一个具有颜色+ git分支名称的字符串。 使用echo -e不会转义字符\[\] (在CLI中自己尝试: echo -e "\[\033[33m\]test" )。

理想情况下,我想根据分支的存在和名称保留这些条件颜色(如果没有分支则为灰色,如果是主分支则为橙色,否则为绿色)。

将颜色序列包装在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提示 的回答 和回显函数内部的颜色 – Stack Overflow


这是我的另一个问题的答案,代码已更改。

当您在提示中添加颜色代码时,您必须添加额外的标记以让终端知道您在提示中有不可见的字符

更改

  echo -e "\033[33m${branch}\033[00m" # yellow 

  echo -e "\[\033[33m\]${branch}\[\033[00m\]" # yellow # .......^^........^^.........^^........^^ 

等等

请参阅bash手册中的控制提示 。