按向上箭头时 Bash 提示错误

按向上箭头时 Bash 提示错误

我为我的 OS X 终端写了这个漂亮且丰富多彩的提示符:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}

export PS1="\e]2;\w\a\e[1;30;1m\][\u@\[\033[0;36m\]\h\e[1;30;1m\]:\[\033[0;35m\]\w\e[1;30;1m\]] \[\033[0;31m\](\t) \[\033[0;33m\]\$(parse_git_branch)\n\[\033[0m\]\e[1;30;1m\]\$\[\e[0m\]"

source ~/.bash_profile这样做了,它工作正常。除了当我使用向上箭头浏览历史记录时,发生了一件奇怪的事情。

source ~/.bash_profile基本上,历史记录中命令的开头成为提示的一部分。当我ctrl+center它恢复正常时,但是一旦我看到source命令的历史记录,提示就会再次改变。

下面是一个我查看过历史记录然后ctrl+u输入的示例ls

[user@host:~/Documents] (14:01:40)  [branch]
$source ~/.ls

对此有什么线索吗?

答案1

您完全破坏了 bash 对已打印内容以及在显示命令历史记录并允许您编辑命令行时必须删除/重写的内容的理解。这是因为您已经对该提示进行了真正的破坏。

  • 为了您自己的理智,请始终使用\e或。\033
  • 制作你的\[\]严格匹配的非嵌套对。
  • 确保全部非打印序列在\[和之内\](相反,所有打印序列均不在和之内)。

(这就是为什么我个人更喜欢 Z Shell 及其替代提示扩展机制,当我想要古怪的彩色提示时。它知道诸如此类的事情%F{green}不是打印序列,而需要被告知;并且它也能从中计算出正确的转义序列terminfo,而不需要对它们进行硬连线。)

相关内容