Bash 提示符不会换行长行,我认为所有内容都被转义了?

Bash 提示符不会换行长行,我认为所有内容都被转义了?

这是我的.bash_profile

export CLICOLOR=1
export LSCOLORS=exfxcxdxbxegedabagacad

# define colors
C_DEFAULT="\[\033[m\]"
C_WHITE="\[\033[1m\]"
C_BLACK="\[\033[30m\]"
C_RED="\[\033[31m\]"
C_GREEN="\[\033[32m\]"
C_YELLOW="\[\033[33m\]"
C_BLUE="\[\033[34m\]"
C_PURPLE="\[\033[35m\]"
C_CYAN="\[\033[36m\]"
C_LIGHTGRAY="\[\033[37m\]"
C_DARKGRAY="\[\033[1;30m\]"
C_LIGHTRED="\[\033[1;31m\]"
C_LIGHTGREEN="\[\033[1;32m\]"
C_LIGHTYELLOW="\[\033[1;33m\]"
C_LIGHTBLUE="\[\033[1;34m\]"
C_LIGHTPURPLE="\[\033[1;35m\]"
C_LIGHTCYAN="\[\033[1;36m\]"
C_BG_BLACK="\[\033[40m\]"
C_BG_RED="\[\033[41m\]"
C_BG_GREEN="\[\033[42m\]"
C_BG_YELLOW="\[\033[43m\]"
C_BG_BLUE="\[\033[44m\]"
C_BG_PURPLE="\[\033[45m\]"
C_BG_CYAN="\[\033[46m\]"
C_BG_LIGHTGRAY="\[\033[47m\]"

# Prompt
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

source $(brew --prefix)/etc/bash_completion.d/git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=true

# PS1="\h:\W \u\$(__git_ps1 \" (%s) \")\$"
PS1="$C_YELLOW\w $C_PURPLE\$(__git_ps1 \"(%s) \")$C_DEFAULT\n ☠️   "

当我输入/复制粘贴长行时,它不会换行到新行。相反,它会覆盖现有的。如果我退格到开头,它也不会删除所有字符。

我查看了其他一些答案,他们都表明包装可能是问题所在,但所有东西似乎都包装正确?

答案1

** 如果克里斯托弗的回答不能解决你的问题......

每一个转义码需要被\[和包围\]。错过一个或一对不匹配,您可能最终会遇到像您所看到的问题。我不知道里面有什么,__git_ps1所以很难说哪里出了问题。

如果您仍然陷入困境,这里有一个小“调试技巧”。 :) 您可以通过将提示转储到文本文件中并在vi.这将确保不渲染任何内容并且您可以看到实际的字符(例如,与仅echo $PS1从命令行执行操作相比)。

echo $PS1 > ps1
vi ps1

如果有很多代码,您可以通过输入:%s/\\[//n然后检查括号数量是否匹配:%s/\\]//n。这将为您提供打开和关闭转义括号的计数...至少您可以通过确认两个计数相同来排除任何不成对的括号。 (我有相当复杂的提示,并且不止一次被不匹配错误所困扰!)

还是想不通?将该文件的内容复制到此处,以便我们可以检查它。

答案2

BASH 将所有字符(无论是否可打印)计算为提示符的长度。计算出的提示长度决定了换行发生的位置。计算出的长度是需要更改的变量。删除 ☠️ 后面的空格并添加另一个空格\[ \]会导致 BASH 在我当前使用 macOS High Sierra、BASH 4.4.12 和 iTerm 3.1.4 的计算机上正确计算换行的位置。

PS1="$C_YELLOW\w $C_PURPLE\$(__git_ps1 \"(%s) \")$C_DEFAULT\n☠️\[ \]"

相关内容