web-dev-qa-db-ja.com

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

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

これが私が欲しいものです:

Vim、MacVim、vi-modeを使用したzshと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用のようです。どんな方向のどんな助けも大歓迎です:)

8
Ramiro Araujo

さまざまなGitHubの問題とマンページに数時間飛び込んだ後、私は自分に合ったセットアップを見つけました。

ArchLinuxでrxvt-unicodev9.22、tmux 2.9a、neovim v0.4.2、zsh5.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構成の場合、重要な行は次のとおりです。

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の問題の中には、init.vimでset guicursor=を設定することに言及しているものがありますが、それを追加するとセットアップが機能しません。

私が提供したものを考慮して、このセットアップが再現可能であることを願っています。そうでない場合、私のドットファイルは GitHub で入手できます。

1
Emil L.