zsh の tmux で vi モードを使用し、カーソルの形状を通常モードと挿入モードの間で切り替える

zsh の tmux で vi モードを使用し、カーソルの形状を通常モードと挿入モードの間で切り替える

(注: この質問は StackOverflow に書きましたが、オフトピックとしてフラグが付けられたため、ここで書き直しています)

私が欲しいものは次のとおりです:

Vim、MacVim、zsh と vi-mode および tmux の間で (可能な限り) 一貫した動作。Vim と MacVim では、挿入-通常モード スイッチは正常に動作し、Vim の場合は、zsh シェルと tmux の両方から Vim を実行することで正常に動作します。Zsh シェルでも、次のようにスイッチを使用して正常に動作します。https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh、どこで見つけたのか思い出せないようです。

これはtmuxでは機能しません。カーソルは挿入モードと通常モードで同じままで、非常に厄介です。おそらく、上記のコードは、tmuxで正しいエスケープシーケンスが印刷されれば、なんとか機能するはずです。私はこれを見つけました。http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursorですが、ちょっと古いようで、zsh ではなく bash 用のようです。どんな方向でも、どんな助けでも大歓迎です :)

答え1

数時間にわたってさまざまな GitHub の問題とマニュアル ページを調べた結果、自分にとって機能する設定が見つかり、あなたが目指していた目標を達成できました。

私は、Arch Linux で rxvt-unicode v9.22、tmux 2.9a、neovim v0.4.2、zsh 5.7.1 を使用しています。私のセットアップは、挿入モードでは点滅しないビーム カーソルを使用し、通常モードでは点滅しないブロック カーソルを使用するように構成されています。

zsh の場合、.zshrc に次のように記述して vi モードを使用します。

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 設定では、重要な行は次の 1 行だけです。

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 での設定について言及されていますが、それを追加しても私のセットアップは機能しません。

私が提供したものでこの設定が再現可能であることを願っています。そうでなければ、私のドットファイルは以下で入手できます。GitHub

答え2

ターミナルでこのコマンドを試してください(enabling zsh-vi-mode/vi-mode plugin):

export VI_MODE_SET_CURSOR=true

うまくいけばそれを追加する/etc/zsh/zshrc~/.zshrc

関連情報