我正在编写一个简单的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小部件有一些明显的问题我不知道吗?
答案 0 :(得分:1)
zle -U
用法是个案。这似乎是出于行为:
zle -U string
...
这会将string
中的字符推送到ZLE的输入堆栈。在当前执行的窗口小部件完成后,ZLE的行为就像用户输入string
中的字符一样。由于ZLE使用堆栈,如果重复使用此选项,则将首先处理推入堆栈的最后一个字符串。但是,每个
string
中的字符将按照它们在字符串中出现的顺序进行处理。
因此,在)
完成后,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.
}