按向上箭头时 Bash 提示错误

Don*_*lio 2 bash macos

我为我的 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\]"
Run Code Online (Sandbox Code Playgroud)

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

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

这是我看过历史然后ctrl+u输入的示例ls

[user@host:~/Documents] (14:01:40)  [branch]
$source ~/.ls
Run Code Online (Sandbox Code Playgroud)

关于这个的任何线索?

Jde*_*eBP 5

您已经完全禁止 bash 的想法,因为它显示了命令历史记录并允许您编辑命令行,因此它已经打印了什么以及它必须擦除/重写什么。这是因为您已经对该提示进行了真正的散列。

  • 二者必选其一\e\033一致,为你自己的理智。
  • 制作您的\[\]严格匹配的非嵌套对。
  • 确保所有非打印序列都在\[and之内\](相反,所有打印序列都不是)。

(这就是为什么当我想要古怪的彩色提示时,我个人更喜欢 Z Shell 及其替代提示扩展机制。它知道诸如%F{green}不打印序列之类的事情,而不必被告知;并且它还可以计算出正确的转义序列来自terminfo,而无需将它们硬接线。)