【问题标题】:zle backward-char not working as expectedzle 后向字符未按预期工作
【发布时间】:2017-09-29 00:59:23
【问题描述】:

我正在编写一个简单的 ZLE 小部件以使用 <C-j> 快速创建子外壳。这是我所拥有的:

function zle_subshell {
  zle -U '$()'
  zle .backward-char
}

# register as widget
zle -N zle_subshell

# create kbd
bindkey '^j' zle_subshell

但是,zle .backward-char 似乎不起作用。更令人困惑的是,如果我将脚本修改为:

function zle_subshell {
  zle -U '$('
  zle -U ')'
  zle .backward-char
}

我得到类似)$(...的输出...

似乎正在反向评估zle_subshell 函数。 ZLE 小部件是否存在一些我不知道的明显问题?

【问题讨论】:

    标签: zsh oh-my-zsh zsh-zle


    【解决方案1】:

    zle -U 的用法是特殊情况。该行为似乎是有意的:

    zle -U string
    ...
    这会将string 中的字符推送到 ZLE 的输入堆栈中。当前执行的小部件完成后,ZLE 的行为就像string 中的字符是用户输入的一样。

    由于 ZLE 使用堆栈,如果重复使用此选项,将首先处理压入堆栈的最后一个字符串。但是,每个string 中的字符将按照它们在字符串中出现的顺序进行处理。

    -- zshzle(1), ZLE BUILTINS, zle -U

    因此,zsh 的行为就像在 zle_subshell 完成后键入了 )$(

    我们可以像这样修改(R)BUFFER来直接改变编辑器缓冲区:

    function zle_subshell {
      RBUFFER='$()'"$RBUFFER"
      repeat 2 do zle .forward-char; done
      # ((CURSOR=CURSOR+2)) # We could do this instead.
    }
    

    【讨论】:

    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多