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"
运行后,给出:
Text before [value edited] Text after
var = "value edited"
知道
n1
如果读取的字符是输入,则读取会将读取变量(带有选项)设置为空值,您可以执行以下操作:请注意,stty 或其他一些捕获的字符不会被转换为字节值:
所有控制字符,除了:
要真正“看到”前面字符上的字符退格,请添加此循环以打印 var(就在上面的代码之后):
编辑 3
要让退格键擦除一个字符,而不是捕获此类字符并打印修改后的字符串,请尝试以下操作:
您可以调用 zsh 的行编辑器(它是完全可配置的,并且通常比 readline(bash 可以使用 调用)高级很多),例如:
read -e
运行后,给出:
虽然
bash
现在允许您将键绑定到 shell 代码小部件,但它会在执行小部件之前清除当前行的内容,因此您必须在Return处理程序上重新绘制提示和值: