多行命令上的 zsh 错误:删除会弄乱字符

zsh bug on multiline commands: deleting messes up characters

如果我键入多行命令,然后 运行 它,一切正常。 当我按向上箭头并想要删除一些字符时,我看到正在删除。如果我 运行 修改后的命令,我可以看到删除是错误的。

通常它 deletes/inserts 个字符在一个方向上移动一个位置。

示例:

$ sort file | uniq | grep -v 'some pattern' |less

我想删除file这个词并用other_file替换它。这就是我要看到的

$ sort other_file | uniq | grep -v 'pattern' |less

这就是实际 运行

$ sort fother_file | uniq | grep -v 'pattern' |less

注意名字 'fother_file'。这真的很烦人,并且基本上不可能修改历史记录。我最终将代码复制粘贴进出 zsh。

这是我的 ~/.zshrc 文件

HISTFILE=~/.zshhistfile
HISTSIZE=40000
SAVEHIST=1000
bindkey -v
zstyle :compinstall filename '/home/shefuto/.zshrc'

autoload -Uz compinit
compinit

if [ -f ~/.aliases ]; then
    . ~/.aliases
fi

export PS1="%{%F{yellow}%}%T]%{%F{green}%}%n%{%F{yellow}%} %~ %{$%f%} "

export WORKON_HOME=~/ve
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
workon tmp2

if [[ -e /etc/bash_completion.d/git-prompt ]]; then
    . /etc/bash_completion.d/git-prompt
fi
setopt PROMPT_SUBST ;
export RPROMPT='%{%F{red}%}$(__git_ps1 2>/dev/null)'

bindkey "^?" backward-delete-char

bindkey -e 

有人知道如何解决这个问题吗?

PS1="...%{$%f%} " 告诉 zsh $ 不会使光标前进,因此 zsh 无法准确了解提示长度。您也不需要 %{...%} 包围 zsh 自己的转义符,因为它知道它们不会移动光标。尝试

PS1="%F{yellow}%T]%F{green}%n%F{yellow} %~ $%f "

%{...%} 将用于包含一个明确的转义字符序列,如 \e[32m,这是用于打开绿色文本的 ANSI CSI 序列。 zsh 为此使用它自己的独立于终端的序列 %F{green}

PS1=$'%{\e[33m%}%T]%{\e[32m\%}%n%{\e[33m%} %~ $%{\e[0m} '