首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zle重置-提示防止使用箭头键浏览历史记录。

zle重置-提示防止使用箭头键浏览历史记录。
EN

Unix & Linux用户
提问于 2017-02-23 21:25:55
回答 1查看 1.9K关注 0票数 3

我刚刚安装了zsh和我的-zsh(我以前的shell是bash)。我的.zshrc完全不受oh默认设置的修改。"git“插件是唯一启用的插件(默认情况下是启用的)。

我使用这一技术创建了一个非常简单的主题:

代码语言:javascript
复制
setopt PROMPT_SUBST
PROMPT='[%D{%L:%M:%S}] '
TMOUT=1
TRAPALRM() {
  zle reset-prompt
}

启用此主题后,我发现上下箭头键无法正确回忆我的历史记录:

  • 当我按一次向上箭头时,我的最新命令就会如期而至地被召回。
  • 当我第二次按向上箭头时,什么都不会发生。我以为我的下一个-最近的命令会被召回。
  • 当我在第一次按上箭头后按下向下箭头,什么都不会发生。我希望提示符返回到我开始使用的空提示符。

如果我只使用上面脚本的内容替换了我的.zshrc (实际上使用了来自主题的提示设置,但禁用了噢- my ),那么我的向上和向下箭头就会像预期的那样工作。

如果我回到我的oh .zshrc,并在我的主题中注释掉zle reset-prompt行,我的历史就会很好(但是时钟已经不存在了)。

如何才能同时使用oh和zle reset-prompt而不导致上下箭头的行为不同呢?这是oh中的一个bug,还是配置错误?

EN

回答 1

Unix & Linux用户

发布于 2019-02-12 09:04:40

您可以使用此函数代替。

代码语言:javascript
复制
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的超时。在外壳超时之后,它将触发SIGALRM信号并退出外壳。TRAPALRM()函数将捕获SIGALRM信号并拦截退出,同时执行定义的函数。

向上/向下箭头的行为并没有不同,而是在提示符重置时触发,因此行为怪异。当您键入或滚动历史记录时,上面的函数将不会运行zle reset-prompt,并消除滞后。唯一的缺点是,在输入之后,提示符将无法更新,直到您做了一些小部件之外的事情(比如按ENTER,它触发了accept-line小部件)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/347182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档