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