Simplest way to change cursor to indicate vim mode
Question
What is the simplest way to change the cursor to indicate vim mode when using zsh?
Notes
I want it to show as a vertical line in insert mode and a block in normal mode.
This is the current code I am using:
# change cursor shape for different vi modes
cursor_mode() {
# See https://ttssh2.osdn.jp/manual/4/en/usage/tips/vim.html for cursor shapes
cursor_block='\e[2 q'
cursor_beam='\e[6 q'
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne $cursor_block
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'beam' ]]; then
echo -ne $cursor_beam
fi
}
zle-line-init() {
echo -ne $cursor_beam
}
zle -N zle-keymap-select
zle -N zle-line-init
}
cursor_mode
1 answer
You can modify your existing code to use the cursor shape codes for a vertical line (or "I" cursor) and a block cursor instead of the beam cursor shape. Here is an updated version of your code that will show a vertical line cursor in insert mode and a block cursor in normal mode:
# change cursor shape for different vi modes
cursor_mode() {
# See https://ttssh2.osdn.jp/manual/4/en/usage/tips/vim.html for cursor shapes
cursor_block='\e[2 q'
cursor_vertical='\e[3 q'
function zle-keymap-select {
if [[ ${KEYMAP} == vicmd ]] ||
[[ $1 = 'block' ]]; then
echo -ne $cursor_block
elif [[ ${KEYMAP} == main ]] ||
[[ ${KEYMAP} == viins ]] ||
[[ ${KEYMAP} = '' ]] ||
[[ $1 = 'vertical' ]]; then
echo -ne $cursor_vertical
fi
}
zle-line-init() {
echo -ne $cursor_vertical
}
zle -N zle-keymap-select
zle -N zle-line-init
}
cursor_mode
This updated code sets the cursor_block variable to the code for a block cursor, and the cursor_vertical variable to the code for a vertical line cursor. In the zle-keymap-select function, it checks the current keymap and the argument passed to the function to determine whether to display the block or vertical line cursor. In the zle-line-init function, it sets the initial cursor shape to the vertical line cursor.
1 comment thread