Ctrl+r是一个很棒的小工具,可以用来搜索.bash_history
以前运行过的命令。
但是,当我在 OS X Terminal.app 中使用它时,我看到了奇怪的行为,我想知道是否有其他人看到同样的情况或知道如何修复它。
- Ctrl+r
- 输入类似
find
- 哦,太酷了,看...这就是我想要的命令
find . -exec grep -q "hello world" '{}' \; -print
- 我想运行该命令,但将 hello world 更改为其他内容。
- 所以我打了←或→
- 现在,命令行上的命令有点类似,但它看起来总是像命令的某个截断版本,如下所示:
-q "blog_posts_by" '{}' \; -print
,其中有完整的命令,我可以使用光标键在行上移动,但并非所有命令都会被打印出来。行上显示的内容与终端实际认为我正在编辑的内容之间存在脱节。
有人知道为什么会发生这种情况吗?在网上搜索这种现象并不容易。
答案1
您的提示中的颜色转义序列可能未正确分隔。它们需要括在\[
和中\]
。
PS1='\[\033[1;36m\]\u\[\033[0m\]@\[\033[1;34m\]\h\[\033[0m\]\$ `
当非打印字符序列被这样括起来时,它们的长度不包含在提示符的长度中,并且当它们换行时,需要计算先前命令的位置才能正确显示。
答案2
这可能是由于您的终端上的退出键配置方式所致,我通常会使用 iTerm 或 Terminal.app 上的左箭头或右箭头,因为我不喜欢立即按回车键,这对您有用吗?
答案3
导致此问题的另一个可能原因是值错误TERM
。例如,当我在 PS1 中使用颜色时发生了这种情况,但我的TERM
设置为xterm
。我将其更改为xterm-256color
,然后 CTRL-r 又开始正常工作了。
答案4
对于那些在 Google 中发现这个问题的人来说 - 在现代 MacOS 中,当使用时zsh
,转义序列不是\[...\]
,但是%{...%}
对 OP 的正确提示是:
PS1='%{\033[1;36m%}\u%{\033[0m%}@%{\033[1;34m%}\h%{\033[0m%}\$ `