Ctrl-y 不恢复 zsh 中的行

Ctrl-y 不恢复 zsh 中的行

我在 Ubuntu 22.04 上运行 zsh 5.8.1。当我在提示符上看到一些文本并输入Ctrl+时u,它会按预期清除该行。但是,当我输入Ctrl+时y,它只显示

$ ^Y

什么可能导致读取行缓冲区无法粘贴?

这是我的 .zshrc:

export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME=""

plugins=(
    colored-man-pages
    colorize
    git
    zsh-autosuggestions
    zsh-interactive-cd
    vi-mode
)

ZSH_AUTOSUGGEST_STRATEGY=(history completion)

source $ZSH/oh-my-zsh.sh
unalias ls
unalias ll
unalias lsa

unalias gst
alias gs='git status'
alias gcob='git checkout -b'

bindkey "^[[1;5C" forward-word
bindkey "^[[1;5D" backward-word
bindkey "^[." insert-last-word

_sig_array=($(kill -l))

_return_status() {
    ret=$?
    if [ $ret -ne 0 ]; then
        if [ $ret -le 128 ]; then
            echo $ret
        else
            sig=$(( $ret - 128 ))
            desc=$_sig_array[sig]
            if [ "$desc" != INT -a "$desc" != TSTP ]; then
                echo SIG$desc
            fi
        fi
    fi
}

_return_status_formatted() {
    out=$(_return_status)
    if [ -n "$out" ]; then
        echo "%F{red}[$out]%f "
    fi
}

_current_branch_formatted() {
    out=$(current_branch)
    if [ -n "$out" ]; then
        if [ -n "$(git status -s | grep -v '^\?')" ]; then
            color=magenta
        else
            color=cyan
        fi
        echo "%F{$color}(git:$out)%f "
    fi
}

export PS1='%F{blue}%n%f@%F{green}%m%f:%F{red}%~%f $ $(_return_status_formatted)$(_current_branch_formatted)'

答案1

zsh如果或变量包含(则假定您更喜欢),则默认情况下将使用vi键绑定。$EDITOR$VISUALvivi

^Y粘贴是一个 emacs 键绑定(相当于vi/ pP

添加:

bindkey -e

向您~/.zshrc表明您想要 emacs 键绑定,无论您选择什么编辑器(与 中相同tcsh)。或者set -o emacs(与 ksh 中相同)。


关于您的其他一些注释~/.zshrc

bindkey "^[." insert-last-word

默认情况下已经存在于emacs模式中,因此您不需要它。

已经有一个内置$signals数组(注意它从EXIT== 0 开始,因此您需要$signals[signum+1]从数字中获取名称)。

的行为grep -v '^\?'未指定。用于grep -v '^?'删除以 开头的行?,或grep -v '^\\?'删除以 开头的行\?

local如果函数不打算成为全局变量,则向函数声明变量是一个好习惯。

也可以看看[[ $desc = (INT|TSTP) ]] || echo SIG$desc

通常,与其他 shell 一样,-a内置运算符[已被弃用。

在这里,您可以((...))一致地使用:

_return_status() {
    local sig desc ret="$?"
    if (( ret != 0 )); then
        if (( ret <= 128 )); then
            echo $ret
        else
            (( sig = ret - 128 ))
            desc=$signals[sig+1]
            if [[ $desc != (INT|TSTP) ]] echo SIG$desc
        fi
    fi
}

相关内容