我的 bash 提示符(我承认是从几个地方偷来的并拼凑在一起的)有时会在使用向上/向下箭头滚动 bash 历史记录时将部分以前的命令添加到其长度中。
例如,如果我之前的命令是:
ls
cd /home/caleb
vim .bashrc
当我按照提示向上滚动两次时,它可能看起来像:
$ vim .bcd /home/caleb
其中前五个字符是上一条命令剩下的。
有人知道为什么会发生这种情况,以及如何阻止它吗?
我的提示是使用此代码设置的(太长了,无法在此处包含):https://gist.github.com/1679352
答案1
您的提示符在某个地方出了问题。通常发生的情况是,您的 shell 认为它输出的是不可打印的术语代码,并期望它占用空间。我能给您的最佳建议是系统地添加(或删除)您的提示符,直到此行为停止,以隔离导致此问题的代码。
答案2
颜色代码需要用方括号括起来。方括号通知 bash 不应打印所括的文本
基于@Phreditor 的示例,这表明在换行符之后进行的任何格式化都会导致原始问题:
export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "
将格式代码包装在 [] 中可确保不会发生令人讨厌的行为:
export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "
文档:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html
由于 PS1 格式导致值太长且难以阅读,因此我将格式代码放在变量中:
BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "
答案3
我遇到了同样的问题,这与颜色定义有关。
就我而言,我有一个多行提示(无论提示显示的路径长度如何,都为当前命令提供大部分空间)。
错误版本:
export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "
好的版本:
export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "
\033[00m
终止颜色。如果它在新行 ( \n
) 之后,它会阻止在终端中正确重绘,以用背景颜色覆盖先前的命令。将其移动到新行后面解决了这个问题。
(使用 Mac OS 10.8 中的终端)
答案4
我遇到了这个问题。我发现了什么?
当 PS1 变量内部有颜色时(例如:“\e[35m”),它总是必须被“\[”和“\]”包围(例如:“\[\e[35m\]”)。
当我按照这个规则标记 PS1 中的所有颜色时,它成功了!
滚动 bash 历史记录不再存在问题。
不好的例子:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; 导出 PS1
好例子:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e[0m\] "; 导出 PS1