vi 모드를 사용하는 zsh의 tmux, 일반 모드와 삽입 모드 사이에서 커서 모양 전환

vi 모드를 사용하는 zsh의 tmux, 일반 모드와 삽입 모드 사이에서 커서 모양 전환

(참고: 이 질문은 stackoverflow에 썼지만 주제에서 벗어난 것으로 표시되어 여기에 다시 작성합니다)

내가 원하는 것은 다음과 같습니다.

vi-mode 및 tmux를 사용하는 Vim, MacVim, zsh 간의 일관된 동작(가능한 한 많이). Vim과 MacVim에서는 삽입-일반 모드 스위치가 잘 작동하고 Vim의 경우 zsh 쉘과 tmux 내에서 Vim을 실행하면 잘 작동합니다. Zsh 셸은 다음을 수행하여 스위치와도 잘 작동합니다.https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh, 어디서 찾았는지 기억이 나지 않는 것 같습니다.

이제 이것은 tmux 내에서 작동하지 않습니다. 커서는 삽입 모드와 일반 모드에서 동일하게 유지되며 정말 짜증납니다. 아마도 tmux에서 올바른 이스케이프 시퀀스가 ​​인쇄되면 avove 코드가 어느 정도 작동할 것입니다. 그리고 나는 이것을 발견했습니다.http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor, 하지만 좀 오래된 것 같고 zsh가 아닌 bash용인 것처럼 보입니다. 어떤 방향으로든 도움을 주시면 매우 환영합니다 :)

답변1

몇 시간 동안 다양한 GitHub 문제와 매뉴얼 페이지를 조사한 후 나에게 맞는 설정을 찾았고, 여러분이 달성하려고 설정한 목표를 달성했습니다.

저는 Arch Linux에서 rxvt-unicode v9.22, tmux 2.9a, neovim v0.4.2 및 zsh 5.7.1을 사용하고 있습니다. 내 설정은 삽입 모드에서 깜박이지 않는 빔 커서를 사용하고 일반 모드에서 깜박이지 않는 블록 커서를 사용하도록 구성되어 있습니다.

zsh의 경우 .zshrc에서 다음과 함께 vi-mode를 사용합니다.

bindkey -v
export KEYTIMEOUT=1

# Change cursor with support for inside/outside tmux
function _set_cursor() {
    if [[ $TMUX = '' ]]; then
      echo -ne $1
    else
      echo -ne "\ePtmux;\e\e$1\e\\"
    fi
}

function _set_block_cursor() { _set_cursor '\e[2 q' }
function _set_beam_cursor() { _set_cursor '\e[6 q' }

function zle-keymap-select {
  if [[ ${KEYMAP} == vicmd ]] || [[ $1 = 'block' ]]; then
      _set_block_cursor
  else
      _set_beam_cursor
  fi
}
zle -N zle-keymap-select
# ensure beam cursor when starting new terminal
precmd_functions+=(_set_beam_cursor) #
# ensure insert mode and beam cursor when exiting vim
zle-line-init() { zle -K viins; _set_beam_cursor }

내 tmux 구성에서 중요한 줄은 다음과 같습니다.

set -g default-terminal "tmux-256color"
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q'

neovim이 urxvt에 대해 올바르게 작동하는지 확인하려면 $TERM이 정확해야 합니다. 나는 다음 줄을 사용하여 .Xresources를 사용하여 이 작업을 수행합니다(나중에 와 병합하는 것을 잊지 마십시오 xrdb -merge ~/.Xresources):

URxvt*termName: rxvt-256color

이제 neovim의 경우 guicursor. 일부 GitHub 문제 set guicursor=에는 init.vim의 설정이 언급되어 있지만 이를 추가하면 설정이 작동하지 않습니다.

내가 제공한 내용을 고려하면 이 설정이 재현 가능하기를 바랍니다. 그렇지 않으면 내 도트 파일을 다음에서 사용할 수 있습니다.GitHub.

답변2

터미널에서 다음 명령을 시도해 보십시오(다음을 사용하여 enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

작동하는 경우 /etc/zsh/zshrc또는 에 추가하세요.~/.zshrc

관련 정보