tmux in zsh mit vi-Modus, Cursorform zwischen Normal- und Einfügemodus umschalten

tmux in zsh mit vi-Modus, Cursorform zwischen Normal- und Einfügemodus umschalten

(Hinweis: Ich habe diese Frage auf Stackoverflow geschrieben, sie wurde jedoch als Offtopic markiert, deshalb schreibe ich sie hier noch einmal.)

Das möchte ich:

Konsistentes Verhalten (so weit wie möglich) zwischen Vim, MacVim, zsh mit vi-mode und tmux. In Vim und MacVim funktioniert der Wechsel zwischen Insert- und Normal-Modus einwandfrei, und im Fall von Vim funktioniert es einwandfrei, wenn Vim sowohl von der zsh-Shell als auch innerhalb von tmux ausgeführt wird. Die Zsh-Shell funktioniert auch gut mit dem Wechsel, wenn Sie Folgendes tun:https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh, und ich weiß nicht mehr, wo ich es gefunden habe.

Dies funktioniert nun nicht innerhalb von tmux. Der Cursor bleibt im Einfüge- und Normalmodus gleich, und das ist wirklich lästig. Angeblich sollte der obige Code irgendwie funktionieren, wenn in tmux eine korrekte Escape-Sequenz gedruckt wird, und ich habe Folgendes gefundenhttp://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor, aber es scheint ziemlich alt zu sein und sieht aus, als wäre es für Bash, nicht für Zsh. Jede Hilfe in jede Richtung ist herzlich willkommen :)

Antwort1

Nachdem ich mich mehrere Stunden lang mit einer Vielzahl von GitHub-Problemen und Manpages befasst habe, habe ich ein Setup gefunden, das für mich funktioniert und mit dem ich, glaube ich, das erreiche, was Sie erreichen wollten.

Ich verwende rxvt-unicode v9.22, tmux 2.9a, neovim v0.4.2 und zsh 5.7.1 unter Arch Linux. Mein Setup ist so konfiguriert, dass im Einfügemodus ein nicht blinkender Balkencursor und im Normalmodus ein nicht blinkender Blockcursor verwendet wird.

Für zsh verwende ich den vi-Modus mit Folgendem in meiner .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 }

Für meine tmux-Konfiguration sind die einzigen wichtigen Zeilen:

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

Damit sich neovim für urxvt korrekt verhält, muss $TERM korrekt sein. Ich mache das mit .Xresources mit der folgenden Zeile (vergessen Sie nicht, anschließend mit zu mergen xrdb -merge ~/.Xresources):

URxvt*termName: rxvt-256color

Für Neovim sollte keine Konfiguration erforderlich sein, außer sicherzustellen, dass nichts manipuliert wird guicursor. Einige GitHub-Probleme erwähnen Einstellungen set guicursor=in Ihrem init.vim, mein Setup funktioniert jedoch nicht, wenn ich diese hinzufüge.

Ich hoffe, dass dieses Setup mit dem, was ich bereitgestellt habe, reproduzierbar ist, andernfalls sind meine Dotfiles verfügbar aufGitHub.

Antwort2

versuchen Sie diesen Befehl auf Ihrem Terminal (mit enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

wenn es funktioniert, fügen Sie es hinzu /etc/zsh/zshrcoder~/.zshrc

verwandte Informationen