终端提示覆盖当前行

终端提示覆盖当前行

我的终端提示行有问题。当线太长时,它会缠绕在同一条线上,然后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)")]

将此视为我的标准提示行

MELISC@work~/dev/bin_tools[((main))]

我能够得到

assdasdasdasdasdadasdsadadasdaddasdadadasdadsadasdsa((main))] asdsadsadsadsadasdasdassdasdasdassdasdassdasdasdasdasdasdasdsadsad

我已经检查过我的.bashrc

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

答案1

您已经完全禁止了 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
  • 使您的非嵌套对严格匹配\[\]
  • 确保全部非打印序列在\[和 之内\](相反,所有打印序列都不在 和 之内)。

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

答案2

虽然 JdeBP 的答案非常好,但我想我应该添加对我有用的答案,因为我的 PS1 已经合适了。我最初将其发布在相关问题上(第2713章)在 GitHub 上的 WSL 存储库上:


我想为后代添加一个“不在这里”,因为这个问题一直让我发疯。我想我终于找到了原因,至少对我来说是这样,所以希望这对其他人有帮助。我在各种发行版的各种系统(版本 18362 - 18975)上都看到过这个问题。我确保 .bashrc 中 PS1 的语法 100% 正确,并且所有非打印字符均已正确转义等。

对我来说问题在于控制台属性。我通过 Microsoft Store 安装了 WSL 发行版(Ubuntu、Debian 和 Kali),并从“开始”菜单运行应用程序。据我了解,这会在 Linux 品牌的经典 Windows 命令提示符控制台中启动 WSL。 (顺便说一句,使用 Shift+右键单击/“在此处打开 linux shell”从文件夹启动会打开相同的控制台窗口)。

无论哪种情况,重点是当您右键单击生成的控制台标题栏,单击“属性”,然后选择“调整大小时自动换行文本输出”选项时,这就是为我解决问题的方法。

控制台属性

文字换行

现在我可以正确输入环绕到下一行的命令,并且可以适当地移动光标。这肯定是某个地方的错误,但我不知道问题出在哪里。

相关内容