zle backward-char无法按预期工作

时间:2017-09-29 00:59:24

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

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

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小部件有一些明显的问题我不知道吗?

1 个答案:

答案 0 :(得分: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.
}