shell Zsh的内联打印自动建议删除时添加额外空间

vq8itlhq  于 2023-03-13  发布在  Shell
关注(0)|答案(1)|浏览(106)

我正在创建一个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

把代码放在一个文件中,并源代码,在这一点上,脚本将打印“作品”时,添加字符和“失败”时,删除。如果有人知道这里发生了什么事或可能的修复请告诉我。谢谢!

bksxznpy

bksxznpy1#

下面是我最终得到的代码,它打印在正确的区域,并自定义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
}

相关问题