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.
}