我刚刚安装了 zsh 和 oh-my-zsh(我以前的 shell 是 bash)。 My.zshrc
完全没有修改 oh-my-zsh 的默认设置。 “git”插件是唯一启用的插件(默认情况下启用)。
我使用创建了一个非常简单的主题这项技术:
setopt PROMPT_SUBST
PROMPT='[%D{%L:%M:%S}] '
TMOUT=1
TRAPALRM() {
zle reset-prompt
}
启用此主题后,我发现向上和向下箭头键无法正确回忆我的历史记录:
- 当我按一次向上箭头时,正如预期的那样,会调用我最近的命令。
- 当我第二次按向上箭头时,没有任何反应。我预计我的下一个最近的命令会被召回。
- 当我第一次按向上箭头后按向下箭头时,没有任何反应。我希望提示符返回到我开始时的空提示符。
如果我.zshrc
用仅有的上面脚本的内容(基本上使用主题中的提示设置,但禁用 oh-my-zsh),我的向上和向下箭头按预期工作。
如果我返回到 oh-my-zsh.zshrc
并注释掉zle reset-prompt
主题中的行,我的历史记录就可以正常工作(但时钟不再存在)。
如何同时使用 oh-my-zsh 并且zle reset-prompt
不会导致向上/向下箭头的行为不同?这是 oh-my-zsh 中的错误,还是配置错误?
答案1
你可以改用这个函数
TRAPALRM() {
case "$WIDGET" in
expand-or-complete|self-insert|up-line-or-beginning-search|down-line-or-beginning-search|backward-delete-char|.history-incremental-search-backward|.history-incremental-search-forward)
:
;;
*)
zle reset-prompt
;;
esac
}
zle reset-prompt
基本上,只有当WIDGET
不在机箱内时才会运行。您可以添加小部件列表以忽略reset-prompt
那里的分隔|
问题是,TMOUT
实际上指定了 shell 的超时时间。 shell 超时后,它将发出SIGALRM
信号并退出 shell。该TRAPALRM()
函数将捕获SIGALRM
信号并拦截退出,同时执行定义的函数。
您的向上/向下箭头的行为没有什么不同,而是在重置提示时触发,因此行为很奇怪。当您输入或滚动历史记录时,上面的函数不会运行zle reset-prompt
,并消除了滞后。唯一的缺点是,提示将无法在您键入后更新,直到您执行小部件之外的操作(例如按下ENTER
哪个按钮会触发accept-line
小部件)。