【问题标题】:Zsh menu completion causes problems after zle reset-promptzle reset-prompt 后 Zsh 菜单完成导致问题
【发布时间】:2014-12-19 00:11:40
【问题描述】:

我的 .zshrc 中有以下代码:

TMOUT=1
TRAPALRM() { zle reset-prompt }

触发菜单完成后,菜单中的所有项目,除了突出显示的一项在TRAPALRM 触发后消失,并且当我在短时间内继续在菜单 zsh segvaults 中导航时

是否有任何修复或解决方法?

编辑:Linux Mint 17 上的 zsh 版本为 5.0.2

编辑:我在 Gentoo 上的 zsh 版本 5.0.7 上观察到同样的事情

【问题讨论】:

  • 你用的是什么版本的zsh?我可以确认具有所选项目例外的项目消失了,但前提是选择了任何项目(Ubuntu 14.04 上的 zsh 5.0.5 和 Arch 上的 zsh 5.0.7,均为 amd64)。但即使我一直按 Tab,我也不会遇到分段错误。所以这两件事可能没有那么密切的关系。
  • 也遇到了这个问题。有什么方法可以在不清除完成项的情况下刷新屏幕?看起来像一个错误 - 为什么完成项目会从视图中清除,但仍然可以选择?

标签: linux shell zsh segmentation-fault


【解决方案1】:

我找到了这个解决方法,基本上可以防止在菜单选择中调用“reset-prompt”:

TRAPALRM() {
    if [ "$WIDGET" != "complete-word" ]; then
        zle reset-prompt
    fi
}

请注意,complete-word 可能对您有所不同;我在TRAPALRM 调用中找到了echo $WIDGET

【讨论】:

  • 这与我的解决方法类似,即为每个完成小部件制作新小部件,关闭 TRAPALRM,调用该完成小部件并再次打开 TRAPALRM,但此解决方案似乎更简单、更干净
  • 不过,这似乎在 zsh 5.0.5 上产生了段错误 - 而它在 5.0.7 上完美运行。
  • 曼恩!你救了我的一天!谢谢!我使用的是fzf-completion,所以在我的情况下,这种情况有效:if ! [[ "$WIDGET" =~ ^(complete-word|fzf-completion)$ ]]; then
【解决方案2】:

我对这个问题的解决方案是检查 $WIDGET 和 $_lastcomp[insert] 的值,以更准确地了解菜单选择目前是否处于活动状态。

autoload -U is-at-least
TMOUT=1
if is-at-least 5.1; then
    # avoid menuselect to be cleared by reset-prompt
    redraw_tmout() {
        [ "$WIDGET" = "expand-or-complete" ] && [[ "$_lastcomp[insert]" =~ "^automenu$|^menu:" ]] || zle reset-prompt
    }
else
    # evaluating $WIDGET in TMOUT may crash :(
    redraw_tmout() { zle reset-prompt }
fi
TRAPALRM() { redraw_tmout }

“扩展或完成”可能是“完整单词”或其他内容,具体取决于绑定到您的选项卡键的键。可以通过bindkey "^I"命令查看。

【讨论】:

  • 除源代码外,任何指向$_lastcomp[insert] 记录在哪里的指针?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多