Como faço para 'ler' ecoar todas as entradas, exceto a linha final no final da digitação?
772
Pressionar Enterainda faz seu trabalho de delimitador, mas o readcomando apenas termina silenciosamente, evitando mexer com a rolagem do console. Basicamente um read -sque afeta apenas a linha final.
Você pode invocar o editor de linha do zsh (que é totalmente configurável e geralmente muito mais avançado que o 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 executar, isso dá:
Text before [value edited] Text after
var = "value edited"
Embora bashagora permita vincular chaves a widgets de código 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 Returnmanipulador:
Sabendo que read define a variável read (com a
n1
opção) para um valor vazio se o caractere lido for um enter, você pode fazer algo como:Observe que os caracteres capturados pelo stty ou alguns outros não serão convertidos em um valor de byte:
Todos os caracteres de controle, exceto:
Para realmente "ver" os caracteres backspace sobre os anteriores, adicione este loop para imprimir var (logo após o código acima):
Editar 3
Para obter o backspace para apagar um caractere, não capture esse caractere e imprima a string modificada, tente o seguinte:
Você pode invocar o editor de linha do zsh (que é totalmente configurável e geralmente muito mais avançado que o readline (que o bash pode invocar com
read -e
)) como:Ao executar, isso dá:
Embora
bash
agora permita vincular chaves a widgets de código 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 Returnmanipulador: