zle Reset-prompt 防止使用箭头键浏览历史记录

zle Reset-prompt 防止使用箭头键浏览历史记录

我刚刚安装了 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小部件)。

相关内容