(примечание: я написал этот вопрос на 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