web-dev-qa-db-ja.com

zshとvimの両方のモードに基づいてカーソルスタイルを変更する

vi-modeoh-my-zshで使用しますaf-magictheme

カーソルのスタイルで、自分が通常モード(ブロック)であるか挿入モード(ビーム)であるかを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では、Vundleおよびterminusを使用します=。

これらの構成では、zshvimの両方が独立して考慮されたときに正常に機能します。ただし、vimからzsh挿入モードで入力すると、vim通常モードで始まります(必要に応じて) )がビーム形状カーソルを表示します。同様に、vimを終了すると、挿入モードzshに戻りますが、カーソルはまだブロック形状です(vimnormal)でした。

この後、初めてモードを切り替えたとき(zshvimの両方で)、カーソルは再び本来の動作をします。

vimに出入りした後に、正しいカーソルを表示するにはどうすればよいですか?

置いてみた

    autocmd VimEnter * stopinsert
    autocmd VimLeave * startinsert

私の~.vimrc、ただしこれはカーソルには影響しません。

8
maddingl

precmd()の代わりにpreexec()を使用する方が良いと思います:

# .zshrc

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

precmd_functions+=(_fix_cursor)

こちらです:

  • 変更する必要はありません.vimrc
  • カーソルは、コマンドを実行せずに新しいプロンプトを作成するときにも固定されます
  • echo -ne '\e[5 q'.zshrcを2回書き込む必要はありません。
8
Pawel Wiejacha

私は解決策を見つけました:

これを~/.vimrc

autocmd VimEnter * silent exec "! echo -ne '\e[1 q'"
autocmd VimLeave * silent exec "! echo -ne '\e[5 q'" 
1
maddingl

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()ではなく、これを使用して解決する方が良いと思います。どちらもプロンプトを修正するのではなく、コマンドを実行するために使用されるためです。

0
Rickyson