zsh(或者可能是 oh-my-zsh)历史记录与多行命令混淆

zsh(或者可能是 oh-my-zsh)历史记录与多行命令混淆

如果我在 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历史记录中的命令,而不是rmtouch命令。

有没有什么方法可以按时间顺序搜索,而不会在历史记录到达多行命令时卡住?

答案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 获得一致的行为,两者都应设置为相同的命令。

相关内容