1

我正在编写一个简单的 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 小部件是否有一些我不知道的明显问题?

4

1 回答 1

1

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

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

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

-- zshzle(1), ZLE 内置,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.
}
于 2017-10-01T00:12:09.897 回答