如果我在 zsh 会话中使用向上箭头,正如您所期望的那样,我会获得以前的命令,从最新到最旧。现在(我不知道是 zsh 还是 oh-my-zsh 这样做),但如果我输入一行的开头并按下向上箭头,我会从历史记录中获得以我输入的内容开头的行。到目前为止一切都很好。
如果我输入多行命令就会出现问题,例如:
for i in foo bar
echo $i
然后如果我稍后点击向上箭头,一旦它到达多行命令,它将只显示以 开头的结果for
。所以如果我的历史记录如下:
touch foo
rm foo
for i in foo bar
echo $i
ls
然后我点击向上箭头,我得到ls
命令,然后是多行for
命令,从那时起,我只能看到for
历史记录中的命令,而不是rm
或touch
命令。
有没有什么方法可以按时间顺序搜索,而不会在历史记录到达多行命令时卡住?
答案1
所描述的行为是由于使用了up-line-or-search
,它将向上移动命令行,并在命令的第一行,它将在历史记录中搜索以第一个单词开头的行。
针对您的问题的解释:
从空行开始,历史记录中的任何行都会匹配。只要只找到单行命令,其行为与up-history
或没有任何区别up-line-or-history
。但是当到达多行命令时,它不再搜索,而是遍历行。当到达顶行时,它会开始新的搜索,但现在它会查找此行中的第一个单词,而不是继续对任何行进行旧的搜索。
默认情况下向上被映射到up-line-or-history
,它会向后浏览历史记录条目,如果是多行命令,则会浏览每一行。up-history
也会浏览历史记录,但会将多行命令视为单行命令。两者都会提供预期的行为。
我建议在你的 zsh 和 Oh-my-ZSH 配置中搜索up-line-or-search
绑定的位置,并将其替换为up-line-or-history
或删除绑定,因为up-line-or-history
无论如何它都是默认的。
此外,根据所使用的终端,按键序列向上是^[OA
或^[[A
。为了从 shell 获得一致的行为,两者都应设置为相同的命令。