oh-my-zsh cursor up before program has finished vs after, 如何使它们的行为一致

oh-my-zsh cursor up before program has finished vs after, how to make them behave consistently

我注意到,如果我在提示符下按向上箭头,那么我会得到上一个命令,然后再次向上得到之前的命令。

而如果我在上一个程序完成之前按向上箭头 ,那么我会显示上一个命令,光标位于行尾,但是天哪-zsh 现在处于 "search for lines that start with ... " 模式,这意味着我无法按向上键获取上一个命令。

我确信这种行为是众所周知的,也是意料之中的,但以防万一你不明白,你可以像这样回购它

  1. 输入lsreturn
  2. 类型sleep 3return
  3. 等待 3 秒提示出现
  4. (应显示sleep 3
  5. 再次按(应显示ls
  6. return(至运行ls
  7. 键入 sleep 3 return (在 3 秒过去之前按向上箭头)
  8. 现在应该显示 sleep 3

  9. 它仍将显示 sleep 3,但它希望它显示 ls。相反,它是在“搜索以 sleep 3 模式而不是 go to previous command 模式开头的命令。

要尝试在这两种情况下清除这些是步骤

  1. lsreturn
  2. 睡觉 3return

但是根据第 3 步是在第 2 步完成之前还是之后发生,他们最终会得到不同的结果。

注意我看到了这个问答:https://unix.stackexchange.com/questions/324623/how-to-make-oh-my-zsh-history-behavior-similar-to-bashs

但这似乎不是我要找的。我喜欢 oh-my-zsh 的部分行 + up = 搜索以部分开头的行。我要解决的问题是,如果我在上面的第 2 步按下向上键,它会神奇地插入一个部分,就像我等到第 2 步完成时一样。

如何让 oh-my-zsh 在这里保持一致,以便过早向上箭头的行为与正常向上箭头相同?

我很惊讶这个问题并不常见。让终端行为不一致是非常令人气愤的。除了大多数使用 oh-my-zsh to 运行 的开发人员,我一直都在解决这个问题并且非常沮丧。

上面带sleep 3的例子只是为了方便说明问题。在实际使用中,即使使用短暂的命令,问题也经常发生。我输入 git status return git commit somefile -m "short comment" return 期待看到"git status"。 66% 的时间我得到 git status 而另外 34% 的时间我得到 `git commit somefile -m "short comment" 并再次按下 只是闪烁光标,我必须按 Ctrl-C 才能退出 zsh 的部分完整模式。

这似乎不是 oh-my-zsh 的常见抱怨,这让我想知道我是否设置有误。

为了更清楚 运行 zsh 没有 oh-my-zsh。

zsh -d -f
autoload -U up-line-or-beginning-search
zle -N up-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search

现在尝试上述步骤。你会得到一致的行为。

这可能是一个矫枉过正的解决方案,但是按照 this 指南,您可以看到可以将新操作绑定到 up/down 箭头键。所以如果你添加:

bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

您的 ~/.zshrc,它应该删除您谈到的功能。我设法让它工作,同时仍然保持常规搜索功能,但这没有经过彻底测试,可能应该小心使用。