tmux en zsh con modo vi, alterna la forma del cursor entre el modo normal y el de inserción

tmux en zsh con modo vi, alterna la forma del cursor entre el modo normal y el de inserción

(nota: escribí esta pregunta en stackoverflow, pero me marcaron como fuera de tema, así que la reescribo aquí)

Esto es lo que quiero:

Comportamiento consistente (tanto como sea posible) entre Vim, MacVim, zsh con vi-mode y tmux. En Vim y MacVim, el interruptor de modo de inserción normal funciona bien y, en el caso de Vim, funciona bien ejecutando Vim tanto desde zsh shell como dentro de tmux. El shell Zsh también funciona bien con el conmutador haciendo esto:https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh, que no recuerdo dónde lo encontré.

Ahora bien, esto no funciona dentro de tmux. El cursor permanece igual en el modo de inserción y en el modo normal, y es realmente molesto. Supuestamente, el código anterior debería funcionar si se imprime una secuencia de escape correcta en tmux, y encontré estohttp://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor, pero parece un poco antiguo y parece que es para bash, no para zsh. Cualquier ayuda en cualquier dirección es bienvenida :)

Respuesta1

Después de unas horas de sumergirme en una amplia variedad de problemas y páginas de manual de GitHub, encontré una configuración que funciona para mí y logró lo que creo que se propuso lograr.

Estoy usando rxvt-unicode v9.22, tmux 2.9a, neovim v0.4.2 y zsh 5.7.1 en Arch Linux. Mi configuración está configurada para usar un cursor de haz que no parpadea en el modo de inserción y un cursor de bloque que no parpadea en el modo normal.

Para zsh, uso vi-mode con lo siguiente en mi .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 mi configuración de tmux, las únicas líneas importantes son:

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

Para asegurarse de que neovim se comporte correctamente para urxvt, $TERM debe ser correcto. Hago esto con .Xresources con la siguiente línea (no olvides fusionar después con xrdb -merge ~/.Xresources):

URxvt*termName: rxvt-256color

Ahora, para neovim, no debería ser necesaria ninguna configuración, aparte de asegurarse de no alterar guicursor. Algunos problemas de GitHub mencionan la configuración set guicursor=en su init.vim, sin embargo, mi configuración no funciona si agrego eso.

Espero que esta configuración sea reproducible dado lo que proporcioné; de lo contrario, mis archivos de puntos están disponibles enGitHub.

Respuesta2

prueba este comando en tu terminal (con enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

si funciona agrégalo a /etc/zsh/zshrco~/.zshrc

información relacionada