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

mad*_*ngl 14 vim zsh oh-my-zsh caret-cursor

我在oh-my-zsh 中使用vi-modeaf-magic主题

我希望光标样式在 in和 in 中指示我是处于正常模式(块)还是插入模式(梁)。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'
    }
Run Code Online (Sandbox Code Playgroud)

如发现here

vim,我使用Vundleterminus

有了这些配置,都zshvim工作,因为他们应该独立时考虑。然而,当我输入vimzsh插入模式vim开始在正常模式下(如它应该),但仍示出了波束形状的光标。同样,当我退出vim,我回到zsh插入模式,但光标仍处于块状(因为在过去的模式vim正常的)。

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

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

我试过放

    autocmd VimEnter * stopinsert
    autocmd VimLeave * startinsert
Run Code Online (Sandbox Code Playgroud)

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

小智 14

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

# .zshrc

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

precmd_functions+=(_fix_cursor)
Run Code Online (Sandbox Code Playgroud)

这边走:

  • 你不必改变 .vimrc
  • 当您在不执行命令的情况下创建新提示时,光标也是固定的
  • 你不必echo -ne '\e[5 q'在你的.zshrc.

  • 但这在进入正常模式时不会变回块 (5认同)

Cor*_*mer 10

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

\n
# vi mode\nbindkey -v\nexport KEYTIMEOUT=1\n\n# Change cursor shape for different vi modes.\nfunction zle-keymap-select {\n  if [[ ${KEYMAP} == vicmd ]] ||\n     [[ $1 = \'block\' ]]; then\n    echo -ne \'\\e[1 q\'\n  elif [[ ${KEYMAP} == main ]] ||\n       [[ ${KEYMAP} == viins ]] ||\n       [[ ${KEYMAP} = \'\' ]] ||\n       [[ $1 = \'beam\' ]]; then\n    echo -ne \'\\e[5 q\'\n  fi\n}\nzle -N zle-keymap-select\nzle-line-init() {\n    zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)\n    echo -ne "\\e[5 q"\n}\nzle -N zle-line-init\necho -ne \'\\e[5 q\' # Use beam shape cursor on startup.\npreexec() { echo -ne \'\\e[5 q\' ;} # Use beam shape cursor for each new prompt.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
Set cursor style (DECSCUSR), VT520.\n0  \xe2\x87\x92  blinking block.\n1  \xe2\x87\x92  blinking block (default).\n2  \xe2\x87\x92  steady block.\n3  \xe2\x87\x92  blinking underline.\n4  \xe2\x87\x92  steady underline.\n5  \xe2\x87\x92  blinking bar, xterm.\n6  \xe2\x87\x92  steady bar, xterm.\n
Run Code Online (Sandbox Code Playgroud)\n

  • @HungVo Ctrl+R 是 emacs 键绑定。一旦您将 zsh 设置为使用 vi 键绑定,您就需要另一个快捷方式。最好是使用这个`bindkey -M vicmd '?' History-incremental-search-backward` 然后,在命令模式下,您可以像在 vi 中一样使用“?”键向后搜索。如果对您来说更有意义,您可以使用“/”来代替。 (2认同)