tmux em zsh com modo vi, alterna a forma do cursor entre o modo normal e de inserção

tmux em zsh com modo vi, alterna a forma do cursor entre o modo normal e de inserção

(nota: escrevi esta pergunta no stackoverflow, mas fui sinalizada como offtopic, então estou reescrevendo aqui)

Aqui está o que eu quero:

Comportamento consistente (tanto quanto possível) entre Vim, MacVim, zsh com vi-mode e tmux. No Vim e no MacVim, a opção de modo de inserção normal está funcionando bem e, no caso do Vim, funciona bem executando o Vim no zsh shell e no tmux. O shell Zsh também funciona bem com o switch fazendo o seguinte:https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh, que não me lembro onde o encontrei.

Agora, isso não funciona no tmux. O cursor permanece o mesmo no modo de inserção e no modo normal, e é muito incômodo. Supostamente, o código acima deve funcionar se uma sequência de escape correta for impressa no tmux, e eu descobri issohttp://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor, mas parece meio antigo e parece ser para bash, não para zsh. Qualquer ajuda em qualquer direção é muito bem-vinda :)

Responder1

Depois de algumas horas mergulhando em uma ampla variedade de problemas e páginas de manual do GitHub, encontrei uma configuração que funciona para mim, alcançando o que acredito que você se propôs a alcançar.

Estou usando rxvt-unicode v9.22, tmux 2.9a, neovim v0.4.2 e zsh 5.7.1 no Arch Linux. Minha configuração está configurada para usar um cursor de feixe sem piscar no modo de inserção e um cursor de bloco sem piscar no modo normal.

Para zsh, eu uso o modo vi com o seguinte em meu .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 }

Para minha configuração do tmux, as únicas linhas importantes são:

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

Para garantir que o neovim se comporte corretamente para o urxvt, $TERM precisa estar correto. Faço isso com .Xresources com a seguinte linha (não esqueça de mesclar depois com xrdb -merge ~/.Xresources):

URxvt*termName: rxvt-256color

Agora, para o neovim, nenhuma configuração deve ser necessária, a não ser certificar-se de não adulterar o guicursor. Alguns problemas do GitHub mencionam a configuração set guicursor=em seu init.vim, porém minha configuração não funciona se eu adicionar isso.

Espero que esta configuração seja reproduzível, considerando o que forneci, caso contrário, meus dotfiles estarão disponíveis emGitHub.

Responder2

tente este comando em seu terminal (com enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

se funcionar, adicione-o /etc/zsh/zshrcou~/.zshrc

informação relacionada