终端提示覆盖当前行

mel*_*isc 7 shell bash prompt bashrc

我的终端提示行有问题。当这条线太长时,它会绕在同一条线上,然后Up arrow让它看起来更糟。

我已经检查过终端提示没有正确换行,但看起来我显然关闭了所有不可打印字符的方括号。

这是我的PS1:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot) }\[\033[01;36m\]\u@\h\[\033[00m\]\033[01;34m\]\w\033[00m\][$(type __git_ps1 >/dev/null 2>&1 && __git_ps1 "(%s)")]
Run Code Online (Sandbox Code Playgroud)

将此视为我的标准提示行

MELISC@work~/dev/bin_tools[((main))]
Run Code Online (Sandbox Code Playgroud)

我能够得到

assdasdasdasdasdadasdsadadasdaddasdadadasdadsadasdsa((main))] asdsadsadsadsadasdasdassdasdasdassdasdassdasdasdasdasdasdasdsadsad
Run Code Online (Sandbox Code Playgroud)

我已经检查过我的 .bashrc

我已经并且shopt -s checkwinsize应该自动检查列

Jde*_*eBP 14

您已经完全禁止了 Bourne Again shell 的想法,即在显示命令历史记录并允许您编辑命令行时必须删除/重写的内容。

将您的提示分成几个部分:

  1. \[\e]0;\u@\h: \w\a\] — 非打印字符,正确封闭
  2. ${debian_chroot:+($debian_chroot) } — 大概只打印字符
  3. \[\033[01;36m\] — 非打印字符,正确封闭
  4. \u@\h — 仅打印字符
  5. \[\033[00m\] — 非打印字符,正确封闭
  6. \033[01;34m\] — 非打印字符,未正确封闭,因此 Bourne Again shell 不知道它们是
  7. \w\033[00m\] — 印刷和非印刷字符的错误混合
  8. [$(type __git_ps1 >/dev/null 2>&1 && __git_ps1 "(%s)")] — 大概只打印字符

我之前已经给出了这个建议,但它也是适用于这里的一般建议:

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

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

  • +1 使用 `banjanxed` (2认同)