我正在努力创建一个提供自动完成的 zsh 脚本,我正在尝试使用 tput 进行内联建议并回显预期的其余输入。它在添加字符时工作正常但在删除时有一个额外的空间被删除的字符。
这是问题的图片。顶行是在添加一个字符之后,如您所见,没有多余的空间。删除字符时会出现多余的空格。
我认为发生的事情是删除一个字符后,由于某种原因不能立即打印行和列。这是重现的最少代码。
这里是重现的最少代码:
function __keypress() {
zle .$WIDGET
__get_cur_pos
tput cup $__fut_row $((__fut_col + 1))
echo "works\033[K"
tput cup $__fut_row $__fut_col
}
function __delete() {
# remove the last character from buffer
BUFFER=${BUFFER%?}
__get_cur_pos
echo "fail\033[K"
tput cup $__fut_row $__fut_col
}
function __get_cur_pos(){
echo -ne "\033[6n"
read -t 1 -s -d 'R' line < /dev/tty
line="${line##*\[}"
__fut_row=$((${line%%;*}-1)) # extract the row number
__fut_col=$((${line##*;}-1)) # extract the column number
unset line
}
zle -N self-insert __keypress
zle -N __del __delete # change the action of delete key to deleting most recent and updating __current_input
bindkey "^?" __del
将代码放在一个文件中并获取它,此时脚本将在添加字符时打印“works”,在删除时打印“fail”。如果有人知道这里发生了什么或可能的解决方法,请告诉我。谢谢!
这是我最终得到的代码,它打印在正确的区域并自定义 BUFFER 右侧的样式。
#! /bin/zsh
function __keypress() {
zle .$WIDGET
POSTDISPLAY="add"
__apply_highlighting
}
function __delete() {
# remove the last character from buffer
# echo -n "fail\033[K"
BUFFER=${BUFFER%?}
POSTDISPLAY="del"
__apply_highlighting
}
zle -N self-insert __keypress
zle -N __del __delete # change the action of delete key to deleting most recent and updating __current_input
bindkey "^?" __del
function __apply_highlighting() {
if [ $#POSTDISPLAY -gt 0 ]; then
region_highlight=("$#BUFFER $(($#BUFFER + $#POSTDISPLAY)) fg=4")
fi
}