Bash 覆盖第一行,PS1 bash 提示

nsg*_*nsg 4 shell bash

我在 bash 中使用了 PS1 和 PROMPT_COMMAND 来创建一个 zsh 风格的右侧提示。我有一个几乎有效的解决方案。

问题是,如果我写了一长行输入,第二行会覆盖第一行。第三行将很好地出现在新行上。

也许由于我的光标移动,某些行计数器是一对一的,还是这是一个限制/错误?

一个简单的例子:

export PS1="prompt>\[\033[s\033[10C\]test\[\033[u\]"
Run Code Online (Sandbox Code Playgroud)

打印prompt>,保存位置,向左移动10个字符,打印test,恢复位置。

提示看起来不错,工作完美,直到我写了不止一行文本。

示例 1,预期行为:

------------------------------------
prompt>          test
prompt>ls        test
files...
prompt>1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 18 19 20 21 22 23 24 25
26 27 28
Run Code Online (Sandbox Code Playgroud)

示例 2,当前行为:

------------------------------------
prompt>          test
prompt>ls        test
files...
14 15 16 17 18 19 20 21 22 23 24 253
26 27 28
Run Code Online (Sandbox Code Playgroud)

nsg*_*nsg 8

啊,当然。测试不应被视为可见字符,而应包含在\[和之间\]

工作示例:

export PS1="prompt>\[\033[s\033[10Ctest\033[u\]"
Run Code Online (Sandbox Code Playgroud)

原因是因为如果 bash 将 test 作为可见字符进行计数,则如果光标和当前行上剩余可用字符的计算将关闭四个字符('test' 的长度),它将假定它是左边的。