(注:我在 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