Как изменить курсор vim в режиме Insert/normal?

Я хотел бы узнать, по возможности, как изменить курсор в vim (цвет, форма и т.д.) в зависимости от того, в каком режиме вы находитесь.

Я постоянно забываю, что я не в режиме вставки и начинаю вводить код, что приводит к разного рода сумасшедшим вещам. Было бы полезно, если бы на курсоре была какая-то визуальная индикация.

Ответ 1

Популярная опция, указывающая на переход в режим Вставки (и обратно в Normal mode) переключает параметр cursorline, который отвечает за текущая строка экрана выделена.

:autocmd InsertEnter,InsertLeave * set cul!

или

:autocmd InsertEnter * set cul
:autocmd InsertLeave * set nocul

Ответ 2

Следующие работы для xterm/urxvt/... (Linux), iTerm2 (Mac), Git Bash с ConEmu (Windows) и т.д. (см. комментарии):

let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" optional reset cursor on start:
augroup myCmds
au!
autocmd VimEnter * silent !echo -ne "\e[2 q"
augroup END

Когда вы используете tmux, важно использовать его так (без \<Esc>Ptmux; escape). tmux будет отслеживать правильную форму курсора при переключении окон/панелей. Вам может потребоваться установить TERM=xterm-256color перед запуском tmux, если он не работает для вас.

Другие параметры (замените номер после \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).

Ответ 3

Если вы используете tmux и iTerm2 на OSX,
следующее меняет курсор с блока на курсор и выделяет текущую строку

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

кредит: https://gist.github.com/andyfowler/1195581

Ответ 4

Чтобы изменить форму курсора в разных режимах, вы можете добавить следующее в свой vimrc.

Для Gnome-Terminal (версия 2.26) Edit

if has("autocmd")
  au InsertEnter * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
  au InsertLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape block"
  au VimLeave * silent execute "!gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/cursor_shape ibeam"
endif

Если вы используете более одного профиля в gnome-терминале, вам, возможно, придется адаптировать его к вашим профилям.

Для Konsole в KDE4Edit

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

Это работает с несколькими вкладками и окнами.

http://vim.wikia.com/wiki/Change_cursor_shape_in_different_modes

Ответ 5

Вы можете попробовать плагин terminus vim:

В режиме вставки форма курсора меняется на тонкую вертикальную полосу. В режиме замены он меняется на подчеркивание. Вернувшись в нормальный режим, он возвращается к стандартной форме "блока".

Ответ 6

Я считаю полезным только мигать курсором в режиме Вставки и статично в других режимах.

set guicursor+=n-v-c:blinkon0

Ответ 7

Это работает правильно на xfce4-терминал:

добавьте следующий скрипт в ваш .vimrc

if has("autocmd")
  au InsertEnter * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_BLOCK/TERMINAL_CURSOR_SHAPE_IBEAM/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au InsertLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"                                                                                          
  au VimLeave * silent execute "!sed -i.bak -e 's/TERMINAL_CURSOR_SHAPE_IBEAM/TERMINAL_CURSOR_SHAPE_BLOCK/' ~/.config/xfce4/terminal/terminalrc"  
endif

Вкратце: как вы знаете, xfce4-терминал сохраняет настройки в .config/xfce4/terminal/terminalrc. Сценарий изменяет TERMINAL_CURSOR_SHAPE_BLOCK на TERMINAL_CURSOR_SHAPE_IBEAM когда вы находитесь в режиме вставки, и возвращается к блокировке, когда вы выходите из режима вставки или vim. Не стесняйтесь менять IBEAM на все, что вы хотите (доступны BLOCK, IBEAM и UNDERLINE).

Ответ 8

Не уверен, что после нажатия клавиши ESC кто-то еще столкнется с задержкой, чтобы вернуться в нормальный режим, чтобы показать курсор блока, но если это так, я тоже так исправлю.

На самом деле я использую iTerm2 и использую Vim внутри моего терминала на Mac. А при входе в режим вставки курсор все еще является блоком и немного сбивает с толку, когда вы находитесь в режиме вставки или нормальном режиме.

Я хотел показать тонкую линию в качестве курсора в режиме вставки и вернуться к блоку в обычном режиме, как это делает MacVim. И сделать это довольно просто, просто добавьте это в мой файл .vimrc, как описано здесь:

let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

enter image description here

Но, как вы можете видеть, была задержка при нажатии ESC, чтобы выйти из режима вставки обратно в нормальный режим и снова показать блок как курсор. Чтобы исправить это, я нашел это:

set ttimeout
set ttimeoutlen=1
set listchars=tab:>-,trail:~,extends:>,precedes:<,space:.
set ttyfast

И теперь это работает довольно хорошо, как вы можете видеть:

fix delay going back to block as cursor

Я надеюсь, что это может помочь кому-либо еще! 👻

Ответ 9

Если вы используете современную версию nvim и хотите этого добиться, вы можете избежать некоторых из этих причудливых обходных путей, перечисленных выше.

Приведенные ниже настройки переключат курсор курсора блока в обычном режиме на курсор подчеркивания при замене на курсор строки при вставке.

# ~/.tmux.conf
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",*256col*:Tc"
set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q',w

" ~/.vimrc
" Sets cursor styles
" Block in normal, line in insert, underline in replace
set guicursor=n-v-c-sm:block,i-ci-ve:ver25-Cursor,r-cr-o:hor20

Мне удалось заставить это работать со следующими настройками, взятыми из этих двух источников.

туй-курсор-форма

guicursor

Ответ 10

Обычно я использую текущий режим vim на статусной линии, между прочим. Если вы ищете простоту, вы можете установить только эту информацию в статусную линию.

Однако, как правило, действительно сумасшедшие вещи случаются, когда у вас закрыты блокировки и находятся в командном режиме (поскольку hjkl теперь HJKL - достаточно J и K достаточно, чтобы заставить вас вытащить ваши волосы, когда вы не понимаете, что происходит Сделайте :h J и :h K, чтобы понять, что я имею в виду). Просто остерегайтесь ключа блокировки колпачка, и вы будете в большей степени в большей степени IMO.