อีกวิธีหนึ่งในการเปลี่ยนรูปร่างเคอร์เซอร์ระหว่าง I-beam และ block (สำหรับขีดล่างใช้\033[4 q) ~/.zshrcเพิ่มไปของคุณ
zle-keymap-select () {
if [ $KEYMAP = vicmd ]; then
    printf "\033[2 q"
else
    printf "\033[6 q"
fi
}
zle -N zle-keymap-select
zle-line-init () {
zle -K viins
printf "\033[6 q"
}
zle -N zle-line-init
bindkey -v
ดัดแปลงจากhttps://bbs.archlinux.org/viewtopic.php?id=95078 ทดสอบใน gnome-terminal 3.22
ปรับปรุง
แต่การแก้ปัญหาอีกครั้งเพื่อให้การเปลี่ยนแปลงรูปร่างเคอร์เซอร์สามารถพบได้ที่นี่ เห็นได้ชัดว่าอันนี้ใช้งานได้กับ iTerm2 ซึ่งฉันไม่มีวิธีทดสอบ แต่เพิ่มไว้ที่นี่ในกรณีที่มันมีประโยชน์สำหรับคนอื่น นอกจากนี้สุดท้ายของคุณ~/.zshrcจะเป็น
function zle-keymap-select zle-line-init
{
    # change cursor shape in iTerm2
    case $KEYMAP in
        vicmd)      print -n -- "\E]50;CursorShape=0\C-G";;  # block cursor
        viins|main) print -n -- "\E]50;CursorShape=1\C-G";;  # line cursor
    esac
    zle reset-prompt
    zle -R
}
function zle-line-finish
{
    print -n -- "\E]50;CursorShape=0\C-G"  # block cursor
}
zle -N zle-line-init
zle -N zle-line-finish
zle -N zle-keymap-select
               
              
CTRL+Cในขณะที่อยู่ในโหมดคำสั่ง vi พร้อมท์จะรีเซ็ต แต่ระบุว่าคุณอยู่ในโหมดคำสั่งเมื่อคุณอยู่ในโหมดแทรกจริงๆzle-line-initควรเปลี่ยนตัวบ่งชี้เป็นโหมดแทรก ด้วยเหตุผลบางอย่าง$KEYMAPไม่ได้รับการอัพเดตอย่างถูกต้องเมื่อเรียก zle-line-init