zsh 中的 tmux 使用 vi 模式,在正常模式和插入模式之间切换光标形状

zsh 中的 tmux 使用 vi 模式,在正常模式和插入模式之间切换光标形状

(注:我在 stackoverflow 上写了这个问题,但被标记为离题,所以我在这里重写)

这是我想要的:

Vim、MacVim、zsh 与 vi 模式和 tmux 之间的行为尽可能一致。在 Vim 和 MacVim 中,插入正常模式开关工作正常,在 Vim 中,通过从 zsh shell 和 tmux 中运行 Vim 也可以正常工作。Zsh shell 也可以通过以下方式与开关配合使用: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,但看起来有点旧,而且看起来像是用于 bash,而不是 zsh。任何方向的帮助都非常受欢迎 :)

答案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 配置,唯一重要的行是:

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

相关内容