几天前我做了 oh-my-zsh 的自动升级。现在我的过滤历史记录(输入几个字母和向上箭头)不再起作用。我没有意识到我对它有多么依赖。
编辑:
例如,我曾经输入命令的几个字母,然后按向上箭头来搜索我的历史记录:
➜ scratch git:(develop) up # press ↑ arrow key
提示更改为:
➜ scratch git:(develop) upupdowndownleftrightleftrightbabastartselect # 3 key presses
我不知道我运行的是什么版本。现在:
➜ scratch git:(develop) echo $ZSH_VERSION
5.0.2
以下是我的 .zshrc 文件中的几行,我认为这些行可以使增量搜索工作:
# Set bindkeys to start search from last word
bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
答案1
光标键有两个事实上的标准转义序列;不同的终端,甚至同一终端不同模式下,可以发送其中之一。例如,xterm\eOA
以Up“应用程序光标模式”或\e[A
其他方式发送。因为Down你可以同时遇到\e[B
和\eOB
等等。
一种解决方案是复制绑定:每当绑定一个转义序列时,将另一个转义序列绑定到同一命令。
bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward
另一种方法是始终绑定一个转义序列,并使另一个转义序列注入另一个转义序列。
bindkey '\e[A' history-beginning-search-backward
bindkey '\e[B' history-beginning-search-forward
bindkey -s '\eOA' '\e[A'
bindkey -s '\eOB' '\e[B'
我不知道为什么升级 oh-my-zsh 会影响 shell 从终端接收的转义序列。也许新版本会执行一些不同的终端初始化,以启用应用程序光标模式。