我的终端提示行有问题。当线太长时,它会缠绕在同一条线上,然后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 关于打印内容以及必须擦除/重写内容的想法,因为它显示命令历史记录并允许您编辑命令行。
将提示分为几个部分:
\[\e]0;\u@\h: \w\a\]
— 非打印字符,正确括起来${debian_chroot:+($debian_chroot) }
- 大概只打印字符\[\033[01;36m\]
— 非打印字符,正确括起来\u@\h
— 仅打印字符\[\033[00m\]
— 非打印字符,正确括起来\033[01;34m\]
— 非打印字符,未正确封闭,因此 Bourne Again shell 不知道它们是\w\033[00m\]
— 打印字符和非打印字符的错误混合[$(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”从文件夹启动会打开相同的控制台窗口)。
无论哪种情况,重点是当您右键单击生成的控制台标题栏,单击“属性”,然后选择“调整大小时自动换行文本输出”选项时,这就是为我解决问题的方法。
现在我可以正确输入环绕到下一行的命令,并且可以适当地移动光标。这肯定是某个地方的错误,但我不知道问题出在哪里。