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

问题描述 投票:0回答:1

我正在努力创建一个提供自动完成的 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”。如果有人知道这里发生了什么或可能的解决方法,请告诉我。谢谢!

shell zsh echo tui tput
1个回答
0
投票

这是我最终得到的代码,它打印在正确的区域并自定义 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
}
© www.soinside.com 2019 - 2024. All rights reserved.