zshとvimのモードに応じてカーソルスタイルを変更する

zshとvimのモードに応じてカーソルスタイルを変更する

私は使うviモード存在するああ、そしてAF - マジック トピック

現在位置にあるかカーソルスタイルで表示したい。ノーマルモード(ブロック)または挿入モード(量)、zshおよび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'
    }

発見するここ

からvimウェンデルそして端末

これらの設定を使用すると、独立して考慮すると両方がうまく機能しますzshvimしかし、私がinvimから入るときzsh挿入モードvimで始まるノーマルモード(そうする必要がありますが)ビーム形状のカーソルはまだ表示されます。同様に終了するとvim再び入りますzsh挿入モードしかし、カーソルはまだブロックにあります(最後のvimモードノーマル)。

その後、初めてモードを切り替えると(inとout 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()プロンプトを変更するのではなく、コマンドを実行するために使用されるため、問題はよりよく解決されると思います。

関連情報