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

Pregunta:

(nota: escribí esta pregunta en stackoverflow, pero me marcaron como fuera de tema, así que la estoy reescribiendo 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 insert-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 al hacer esto: https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh , que no parece recordar dónde lo encontré.

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

Respuesta:

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í, logrando lo que creo que te propusiste 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 he proporcionado; de lo contrario, mis archivos de puntos están disponibles en GitHub .

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım