zle backward char не работает должным образом

Я пишу простой виджет 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, о которых я не знаю?

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.
}
Другие вопросы по тегам