我正在编写一个简单的ZLE小部件,以便使用<C-j>快速创建子subshells。我现在拥有的是:
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小部件有什么明显的问题吗?
发布于 2017-10-01 00:12:09
zle -U的用法是特例。看来这种行为的目的是:
zle -U string..。 这会将string中的字符推到ZLE的输入堆栈上。在当前执行的小部件完成后,ZLE将表现为用户输入了string中的字符。 由于ZLE使用堆栈,如果重复使用此选项,将首先处理推到堆栈上的最后一个字符串。但是,每个string中的字符将按照它们在字符串中的出现顺序进行处理。--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.
}https://stackoverflow.com/questions/46480281
复制相似问题