Vim

在 zsh 和 vim 中根據模式更改游標樣式

  • December 26, 2021

我在*oh-my-zsh中使用vi-modeaf-magic主題*。

我希望游標樣式指示我是處於正常模式(塊)還是插入模式(光束),無論是 inzsh還是 in vim

這是我到目前為止所擁有的:

在我的~/.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'
   }

如發現here

vim中,我使用*Vundle總站*。

使用這些配置,當獨立考慮時,兩者都可以正常工作zshvim但是,當我vim插入模式zsh進入時,以正常模式開始(應該如此),但仍顯示光束形狀游標。同樣,當我退出時,我回到插入模式,但游標仍然是塊狀(因為最後一個模式是正常的)。vim``vim``zsh``vim

在此之後,當我第一次切換模式(在zsh和中vim)時,游標再次按照應有的方式執行。

如何讓它們在進入和退出後也顯示正確的游標vim

我試著把

   autocmd VimEnter * stopinsert
   autocmd VimLeave * startinsert

在我的~.vimrc,但這不會影響游標。

我認為最好使用precmd()而不是preexec()

# .zshrc

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

precmd_functions+=(_fix_cursor)

這邊走:

  • 你不必改變.vimrc
  • 當您在不執行命令的情況下創建新提示時,游標也已修復
  • 你不必echo -ne '\e[5 q'在你的.zshrc.

這對我來說非常有效,它取自這裡: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.

引用自:https://unix.stackexchange.com/questions/433273