How do I change the cursor between Normal and Insert modes in Vim?
A popular approach to indicate switching to and from Insert mode is
toggling the cursorline
option, which is responsible for whether
the current screen line is highlighted (see :help cursorline
):
:autocmd InsertEnter,InsertLeave * set cul!
or, alternatively:
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
Modify the CursorLine
highlighting group to change the styling
of the cursor line to your liking (see :help :highlight
and
:help highlight-groups
).
The following works in xterm, urxvt, and other terminal emulators on Linux; iTerm2 on macOS; Git Bash with ConEmu on Windows; and more (see comments):
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"
" Optionally reset the cursor on start:
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END
Other options (replace the number after \e[
):
Ps = 0 -> blinking block.
Ps = 1 -> blinking block (default).
Ps = 2 -> steady block.
Ps = 3 -> blinking underline.
Ps = 4 -> steady underline.
Ps = 5 -> blinking bar (xterm).
Ps = 6 -> steady bar (xterm).
When you use tmux, it is important to use it like that (without the \<Esc>Ptmux;
escape). tmux will keep track of the correct cursor shape when you switch windows/panes.
If it does not work for you, try either to set TERM=xterm-256color
before starting tmux, or add this to your .tmux.conf
(thanks @Steven Lu):
set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'
If you are using tmux and iTerm2 on macOS,
the following changes the cursor from a block to a cursor and highlights the current line
if exists('$TMUX')
let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
else
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
endif
:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul
credit: https://gist.github.com/andyfowler/1195581