zsh 및 vim의 모드에 따라 커서 스타일 변경

zsh 및 vim의 모드에 따라 커서 스타일 변경

나는 사용한다vi 모드존재하다아 맙소사그리고AF-매직 주제.

현재 위치에 있는지 커서 스타일로 표시하고 싶습니다.일반 모드(블록) 또는삽입 모드(량), 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나는웬델그리고단말기.

이러한 구성을 사용하면 독립적으로 고려할 때 둘 다 잘 작동합니다 zsh. vim그러나 내가 in vim에서 들어갈 때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()둘 다 프롬프트를 수정하는 것이 아니라 명령을 실행하는 데 사용되기 때문에 문제가 더 잘 해결될 것이라고 생각합니다 .

관련 정보