Você poderia invocar o editor de linhas do zsh (que é totalmente configurável e geralmente muito mais avançado que readline (que o bash pode invocar com read -e
)) como:
var=$(
saved_tty=$(stty -g)
var=default-value zsh -c '
zle-line-finish() { # hook run upon leaving the line editor (zle)
CURSOR=$#BUFFER # move the cursor to the end
zle -R # force a redraw of the editor
printf %s $BUFFER # output value on stdout
kill $$ # kill ourself to prevent zle cleanup
}
zle -N zle-line-finish
vared -p "Text before [" var'
# we need to restore the tty settings by ourselves, as we prevented zsh
# from doing so when killing it:
stty "$saved_tty"
)
printf '] Text after\n'
printf 'var = "%s"\n' "$var"
Ao correr, isso dá:
Text before [value edited] Text after
var = "value edited"
Enquanto bash
agora permite ligar chaves a widgets de código de shell, ele limpa o conteúdo da linha atual antes de executar o widget, então você teria que redesenhar o prompt e o valor em seu Return handler:
var=$(prompt="Text before [" var=default-value bash -c '
bind -x '\''"\r":printf >&2 %s "$prompt$READLINE_LINE"; printf %s "$READLINE_LINE"; exit'\'' 2> /dev/null
IFS= read -rep "$prompt" -i default-value')
printf '] Text after\n'
printf 'var = "%s"\n' "$var"