tmux в zsh с режимом vi, переключение формы курсора между обычным режимом и режимом вставки

tmux в zsh с режимом vi, переключение формы курсора между обычным режимом и режимом вставки

(примечание: я написал этот вопрос на stackoverflow, но он был помечен как оффтоп, поэтому я переписываю его здесь)

Вот что я хочу:

Согласованное поведение (насколько это возможно) между Vim, MacVim, zsh с vi-mode и tmux. В Vim и MacVim переключатель режима insert-normal работает просто отлично, а в случае Vim работает отлично при запуске Vim как из оболочки zsh, так и из tmux. Оболочка Zsh также хорошо работает с переключателем, если сделать так:https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh, который я, кажется, не помню, где я нашел.

Теперь это не работает в tmux. Курсор остается тем же в режиме вставки и в обычном режиме, и это действительно раздражает. Предположительно, код avove должен работать, если в tmux печатается правильная последовательность escape, и я нашел этоhttp://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor, но выглядит немного старым и похоже, что это для bash, а не zsh. Любая помощь в любом направлении очень приветствуется :)

решение1

После нескольких часов погружения в широкий спектр проблем GitHub и страниц man-документов я нашел подходящую для меня настройку, которая позволяет достичь того, чего, как я считаю, вы хотели добиться.

Я использую rxvt-unicode v9.22, tmux 2.9a, neovim v0.4.2 и zsh 5.7.1 под Arch Linux. Моя настройка настроена на использование немигающего курсора-луча в режиме вставки и немигающего курсора-блока в обычном режиме.

Для zsh я использую vi-mode со следующими данными в моем .zshrc:

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, однако моя настройка не работает, если я добавляю ее.

Надеюсь, что эта настройка воспроизводима, учитывая то, что я предоставил, в противном случае мои dotfiles доступны наGitHub.

решение2

попробуйте выполнить эту команду на своем терминале (с enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

если это работает, добавьте это в /etc/zsh/zshrcили~/.zshrc

Связанный контент