Vim
在 zsh 和 vim 中根據模式更改游標樣式
我在*oh-my-zsh中使用vi-mode和af-magic主題*。
我希望游標樣式指示我是處於正常模式(塊)還是插入模式(光束),無論是 in
zsh
還是 invim
。這是我到目前為止所擁有的:
在我的
~/.zshrc
:# vim mode config # --------------- # Activate vim mode. bindkey -v # Remove mode switching delay. KEYTIMEOUT=5 # Change cursor shape for different vi modes. function zle-keymap-select { if [[ ${KEYMAP} == vicmd ]] || [[ $1 = 'block' ]]; then echo -ne '\e[1 q' elif [[ ${KEYMAP} == main ]] || [[ ${KEYMAP} == viins ]] || [[ ${KEYMAP} = '' ]] || [[ $1 = 'beam' ]]; then echo -ne '\e[5 q' fi } zle -N zle-keymap-select # Use beam shape cursor on startup. echo -ne '\e[5 q' # Use beam shape cursor for each new prompt. preexec() { echo -ne '\e[5 q' }
如發現here。
使用這些配置,當獨立考慮時,兩者都可以正常工作
zsh
。vim
但是,當我vim
從插入模式zsh
進入時,以正常模式開始(應該如此),但仍顯示光束形狀游標。同樣,當我退出時,我回到插入模式,但游標仍然是塊狀(因為最後一個模式是正常的)。vim``vim``zsh``vim
在此之後,當我第一次切換模式(在
zsh
和中vim
)時,游標再次按照應有的方式執行。如何讓它們在進入和退出後也顯示正確的游標
vim
?我試著把
autocmd VimEnter * stopinsert autocmd VimLeave * startinsert
在我的
~.vimrc
,但這不會影響游標。
我認為最好使用
precmd()
而不是preexec()
:# .zshrc _fix_cursor() { echo -ne '\e[5 q' } precmd_functions+=(_fix_cursor)
這邊走:
- 你不必改變
.vimrc
- 當您在不執行命令的情況下創建新提示時,游標也已修復
- 你不必
echo -ne '\e[5 q'
在你的.zshrc
.
這對我來說非常有效,它取自這裡:https ://gist.github.com/LukeSmithxyz/e62f26e55ea8b0ed41a65912fbebbe52
# vi mode bindkey -v export KEYTIMEOUT=1 # Change cursor shape for different vi modes. function zle-keymap-select { if [[ ${KEYMAP} == vicmd ]] || [[ $1 = 'block' ]]; then echo -ne '\e[1 q' elif [[ ${KEYMAP} == main ]] || [[ ${KEYMAP} == viins ]] || [[ ${KEYMAP} = '' ]] || [[ $1 = 'beam' ]]; then echo -ne '\e[5 q' fi } zle -N zle-keymap-select zle-line-init() { zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) echo -ne "\e[5 q" } zle -N zle-line-init echo -ne '\e[5 q' # Use beam shape cursor on startup. preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
您可以通過更改以下序列中的數字
\e[5 q
(5 代表光束,1 代表塊)來自定義所需的游標類型(閃爍或不閃爍、|、矩形或 _),如下所示:Set cursor style (DECSCUSR), VT520. 0 ⇒ blinking block. 1 ⇒ blinking block (default). 2 ⇒ steady block. 3 ⇒ blinking underline. 4 ⇒ steady underline. 5 ⇒ blinking bar, xterm. 6 ⇒ steady bar, xterm.