Backspace 删除 Bash 提示

the*_*ien 8 bash prompt

我最近通过$PS1变量修改了我的 Bash 提示,以便我可以有颜色。它在我的.bashrc文件中:

PS1="\\[\e[0;32m[\h::\W] >>\e[m "
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入一些东西然后必须退格来清除它,整个提示就会消失。如果我点击进入一个新的出现。

查看关于同一问题的这个问题,我似乎缺少一个右括号。不过,我不知道它会去哪里。

mik*_*erv 12

起初我认为反斜杠会在双引号内自我转义,这就是问题所在,但是,再想一想,"\\["相当于'\['所以情况并非如此 - 它会以这种方式工作。

但真正的问题是,readline不知道有多少字符被绘制到屏幕上,有多少字符在终端转义时被截获。事实上,它可能认为根本没有打印任何提示,因为您的提示基本上由一个开引号的字符串组成。

因此,正如我在评论中指出的,您需要关闭序列。该\[方法在提示中开始非打印转义序列 - 这样readline可以跟踪屏幕上绘制了多少个字符。您还需要像这样结束它:

PS1='\[non-printing terminal escapes here\]' 

man bash 2>/dev/null | grep '^ *\\\[' -A5

\[     begin  a  sequence  of   non-printing
       characters,  which  could  be used to
       embed  a  terminal  control  sequence
       into the prompt
\]     end  a sequence of non-printing char?
       acters
Run Code Online (Sandbox Code Playgroud)

  • @theillien:不确定,但我认为 `PS1='\[\e[0;32m[\h::\W] >>\e[\]m '` 可能不对。您可能仍然不在计数范围内,尽管您可能不会注意到,直到您开始进行一些提示重绘 - 例如在`$PS2` 左右的换行符。我认为这更安全 `PS1='\[\e[0;32m\][\h::\W] >>\[\e[m\] '` - 看看 `\e` 位是如何封闭的在 `\[...\]` 引用的部分,但打印位 - 即使是 `bash` 特定的转义 * 不* 封闭。`readline` 需要知道终端拦截了哪些位——比如颜色转义——以及哪些位实际出现在屏幕上。因此`\[...\]` (2认同)