zsh 中的 tmux 使用 vi 模式,在正常模式和插入模式之間切換遊標形狀

zsh 中的 tmux 使用 vi 模式,在正常模式和插入模式之間切換遊標形狀

(註:我在 stackoverflow 上寫了這個問題,但被標記為離題,所以我在這裡重寫它)

這就是我想要的:

Vim、MacVim、帶有 vi-mode 的 zsh 和 tmux 之間的行為(盡可能)一致。在 Vim 和 MacVim 中,插入正常模式開關工作得很好,在 Vim 情況下,透過從 zsh shell 和 tmux 中運行 Vim 也可以正常工作。透過執行以下操作,Zsh shell 也可以與交換器很好地配合使用:https://raw.github.com/ramiroaraujo/dotfiles/master/zsh/vi-mode.zsh,我似乎不記得在哪裡找到它了。

現在這在 tmux 中不起作用。遊標在插入模式和正常模式下保持不變,這真的很煩人。 Suposly,如果在 tmux 中列印了正確的轉義序列,則 avove 程式碼應該可以工作,我發現了這個http://reza.jelveh.me/2011/09/18/zsh-tmux-vi-mode-cursor,但看起來有點舊,看起來像是 bash 的,而不是 zsh 的。非常歡迎任何方向的幫助:)

答案1

經過幾個小時深入研究各種 GitHub 問題和手冊頁後,我找到了一個適合我的設置,實現了我相信您想要實現的目標。

我在 Arch Linux 下使用 rxvt-unicode v9.22、tmux 2.9a、neovim v0.4.2 和 zsh 5.7.1。我的設定配置為在插入模式下使用不閃爍光束遊標,在正常模式下使用不閃爍塊遊標。

對於 zsh,我使用 vi 模式,並在 .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 }

對於我的 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 問題提到了set guicursor=init.vim 中的設置,但是如果我添加它,我的設置將不起作用。

希望這個設定可以重現我所提供的內容,否則我的點文件可以在GitHub

答案2

在您的終端機上嘗試此命令(使用enabling zsh-vi-mode/vi-mode plugin)

export VI_MODE_SET_CURSOR=true

如果它有效,請將其添加到/etc/zsh/zshrc~/.zshrc

相關內容