一直在使用很久前从 archwiki 抄过来的命令提示符:
PS1="$sq_color\342\224\214\342\224\200\$([[ \$? != 0 ]] && echo -e \"[\033[1;37m\342\226\210$sq_color]\342\224\200\")$sq_color[\033[1;37m\t$sq_color]\342\224\200[\033[1;37m\u@\h$sq_color]\n$sq_color\342\224\224\342\224\200\342\224\200> \033[1;37m\W$sq_color $ \033[1;37m>>\033[0m "
但这个命令提示符在遇到长命令后,在历史记录的上下滚动中会产生显示问题:
执行#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
后按C-p
再C-n
:
┌─[18:18:08]─[mark@a550jk4200]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
┌─[18:18:23]─[mark@a550jk4200]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
再C-p
:
┌─[18:18:08]─[mark@a550jk4200]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
┌─[18:18:23]─[mark@a550jk4200]
└──> ~ $ >> #hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
这个命令提示符哪里出了问题?
我曾把些字符用 vt100 的 escape 键来表示,但也不行。
你这太复杂了,一眼望不到头。分解成多项比较好理解,也利于排错。
我之前遇到 echo 导致的错误(具体什么现象忘记了),后来改为 printf 解决。我用的是 macOS 系统。
把字符改成 ascii 字符,短了点,错误依旧:
PS1="$sq_color|-\$([[ \$? != 0 ]] && echo -e \"[\033[1;37mO$sq_color]\342\224\200\")$sq_color[\033[1;37m\t$sq_color]-[\033[1;37m\u@\h$sq_color]\n$sq_color|--> \033[1;37m\W$sq_color $ \033[1;37m>>\033[0m "
把echo -e
改成printf
错误依旧。
我怀疑在我这里,PS1 不能有 esacpe,因为下面的 PS1 也有这问题:
PS1="\033[0m\u@\h \W $"
PS1 后面的 \033[0m
是色彩吗?好像不完整,应该是对称的一组数字,例如:
$ echo -e "\033[0;31m 红色 \033[0m"
各种颜色值:
我注意到他的颜色都包在了\[
和\]
里面,我就改成了这样,成功了,但不确定是不是所有的 escape 都这样。。。
我用 NetBSD + ksh93 + vt100 时,所有 escape 都没包在\[
和\]
里,没这问题,不知道这特性是不是 bash 特有的。
我在 ~/.bash_prompt 文件里也是有 \[ \]
包裹的,直接命令行打印演示则应去掉,否则\[
和 \]
会原样输出。
我又发现了新的问题,这个问题只会在ansi-term
或term
中出现,同时如果把它们的TERM
改成dumb-emacs-ansi
的话也没问题。
这个问题就是上下选择命令历史记录时(选择方法见主楼,多C-p
、C-n
几次),遇到较长命令,命令提示符的>>
会消失。
基于之前的经验,我怀疑是 escape 的问题,就用如下删除了颜色,不过问题还是会出现。
export PS1=$(echo $PS1 | sed -e 's/1;37/0;37/g' | sed -e 's/0;//g' | sed -e 's/\\\[\\033\[[0-9]\+m\\\]//g')' '
删除颜色后的PS1
:
\342\224\214\342\224\200$([[ $? != 0 ]] && echo -e "[\342\226\210]\342\224\200")[\t]\342\224\200[\u@\h]\n\342\224\224\342\224\200\342\224\200> \W $ >>