在 zsh 和 vim 中根据模式更改光标样式

在 zsh 和 vim 中根据模式更改光标样式

我用vi模式哦我的zshaf-魔法 主题

我希望光标样式能够表明我是否处于正常模式(块)或插入模式(梁),在 和zshvim

这是我到目前为止所拥有的:

在我的~/.zshrc

    # vim mode config
    # ---------------

    # Activate vim mode.
    bindkey -v

    # Remove mode switching delay.
    KEYTIMEOUT=5

    # Change cursor shape for different vi modes.
    function zle-keymap-select {
      if [[ ${KEYMAP} == vicmd ]] ||
         [[ $1 = 'block' ]]; then
        echo -ne '\e[1 q'

      elif [[ ${KEYMAP} == main ]] ||
           [[ ${KEYMAP} == viins ]] ||
           [[ ${KEYMAP} = '' ]] ||
           [[ $1 = 'beam' ]]; then
        echo -ne '\e[5 q'
      fi
    }
    zle -N zle-keymap-select

    # Use beam shape cursor on startup.
    echo -ne '\e[5 q'

    # Use beam shape cursor for each new prompt.
    preexec() {
       echo -ne '\e[5 q'
    }

发现这里

在 中vim,我使用文德尔终点站

通过这些配置,当独立考虑时,两者都可以正常工作zshvim但是,当我vimzshin进入时插入模式vim开始于正常模式(应该如此)但仍然显示光束形状光标。同样,当我 exit 时vim,我回到zshin插入模式,但光标仍处于块状(因为最后一个模式vim普通的)。

此后,当我第一次切换模式(在 和zsh)时vim,光标再次按其应有的方式运行。

如何让它们在进入和退出后vim也显示正确的光标?

我尝试把

    autocmd VimEnter * stopinsert
    autocmd VimLeave * startinsert

在 my 中~.vimrc,但这不会影响光标。

答案1

我认为最好使用precmd()而不是preexec()

# .zshrc

_fix_cursor() {
   echo -ne '\e[5 q'
}

precmd_functions+=(_fix_cursor)

这边走:

  • 你不必改变.vimrc
  • 当您创建新提示而不执行命令时,光标也会被修复
  • 你不必echo -ne '\e[5 q'在你的.zshrc.

答案2

这对我来说非常有效,它取自这里:https://gist.github.com/LukeSmithxyz/e62f26e55ea8b0ed41a65912fbebbe52

# vi mode
bindkey -v
export KEYTIMEOUT=1

# Change cursor shape for different vi modes.
function zle-keymap-select {
  if [[ ${KEYMAP} == vicmd ]] ||
     [[ $1 = 'block' ]]; then
    echo -ne '\e[1 q'
  elif [[ ${KEYMAP} == main ]] ||
       [[ ${KEYMAP} == viins ]] ||
       [[ ${KEYMAP} = '' ]] ||
       [[ $1 = 'beam' ]]; then
    echo -ne '\e[5 q'
  fi
}
zle -N zle-keymap-select
zle-line-init() {
    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
    echo -ne "\e[5 q"
}
zle -N zle-line-init
echo -ne '\e[5 q' # Use beam shape cursor on startup.
preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.

\e[5 q您可以通过按以下顺序更改数字(5 表示光束,1 表示块)来自定义所需的光标类型(是否闪烁、|、矩形或_),如下所示:

Set cursor style (DECSCUSR), VT520.
0  ⇒  blinking block.
1  ⇒  blinking block (default).
2  ⇒  steady block.
3  ⇒  blinking underline.
4  ⇒  steady underline.
5  ⇒  blinking bar, xterm.
6  ⇒  steady bar, xterm.

答案3

只需添加以下行:

export VI_MODE_SET_CURSOR=true

给你的~/.zshrc.讨论中提到了问题#9570

答案4

您还可以使用zle-line-init()

zle-line-init() {
    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
    echo -ne "\e[5 q"
}

我认为使用这个可以更好地解决这个问题,而不是precmd()或者preexec()因为两者都旨在用于执行命令,而不是修复提示。

相关内容