Как в Vim переключать курсор между режимами Normal и Insert?


108

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

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


20
Предлагаю вам усвоить одно правило: перестали печатать => выйти из режима вставки. Тогда вы никогда не встретите ситуации, когда вы забудете, что находитесь не в режиме вставки.
ZyX

2
@ZyX, кроме случаев, когда вы забыли выйти из режима вставки после того, как перестали печатать: p
создано

3
@ZyX - прекрасное правило, и я всегда так делал, но визуальные индикаторы по-прежнему важны. Марихуана теперь легальна, и я все время забываю, чем занимаюсь.
felwithe

Ответы:


108

Популярным вариантом обозначения переключения в режим вставки и из него является переключение cursorlineпараметра, который отвечает за то, будет ли выделена текущая строка экрана (см. :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

или, альтернативно:

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

Измените группу CursorLineвыделения, чтобы изменить стиль линии курсора по своему вкусу (см. :help :highlightИ :help highlight-groups).


6
Я также установил куль для выделения bg вместо подчеркивания по умолчанию: привет CursorLine cterm = NONE ctermbg = black
Никита Прокопов

Есть ли причина, по которой это не работает в cygwin vim? Я в редакторе и ввел оба набора строк, и мне не удалось установить какое-либо выделение, кроме выделения всего столбца или строки
TankorSmash

@Tankor: cursorlineопция не зависит от возможностей платформы; он доступен в любом экземпляре Vim, скомпилированном с этой +syntaxфункцией (что обычно и бывает).
ib.

Конечно, сохраните это в ~ / .vimrc для постоянства, как zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
alchemy

76

Следующее работает в xterm, urxvt и других эмуляторах терминала в Linux; iTerm2 на macOS; Git Bash с ConEmu в Windows; и многое другое (см. комментарии):

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

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

Когда вы используете tmux , важно использовать его таким образом (без \<Esc>Ptmux;выхода). tmux будет отслеживать правильную форму курсора при переключении окон / панелей.

Если это не сработает для вас, попробуйте либо установить TERM=xterm-256colorперед запуском tmux, либо добавить это в свой .tmux.conf( спасибо @Steven Lu ):

set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'

2
Сейчас отлично работает в ловкости
Стивен Лу

Идеально работает в xfce4-terminal
korst1k

@Charles О том, почему он не работает в шпатлевке, смотрите здесь: superuser.com/questions/304318/…
WesternGun

1
Мое обновление: наконец-то работаю с set -ga terminal-overrides ',*:Ss=\E[%p1%d q:Se=\E[2 q'моей конфигурацией tmux. Очевидно , если вы используете setдля terminal-overridesбез -a, он переопределяет параметр, который уже имеет это там по умолчанию.
Стивен Лу,

1
решение имеет значительную задержку изменения формы из режима вставки в нормальный режим на простом терминале (suckless st)
daGo

16

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

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


1
Обратите внимание, что это характерно для iTerm . Поскольку стандартные терминалы на самом деле тоже работают, но также работают во всех других поддерживающих терминалах, это, вероятно, неправильный ответ. Смотрите здесь -> stackoverflow.com/a/42118416/340947
Стивен Лу

@StevenLu на самом деле тот, который в предложенном вами ответе, не работал для iTerm2 (Mac), а этот работал. Этот материал более сложен, чем вы могли ожидать.
CS

Этот курсор - определенно одна из самых неудобных вещей. Я только что понял, что даже не думаю, что у меня есть правильная настройка, поскольку tmux, похоже, не выполняет отслеживание состояния курсора, что, как указывают некоторые ответы, является возможным. Я был достаточно счастлив, просто чтобы заставить vim обрабатывать установку курсора на строку в режиме вставки.
Стивен Лу

Я понял это. Решение состоит в том, чтобы настроить tmux для правильной обработки, и это может быть неочевидным. Что мне нужно было сделать, так это убедиться, что моя конфигурация tmux terminal-overridesтолько добавляется, чтобы она не затирала ,*:Ss=\E[%p1%d q:Se=\E[2 qчасть terminal-overrides. так что моя конфигурация выглядит так set -sa terminal-overrides ",xterm-256color-italic:Tc"(чтобы установить 24-битный цвет, разрешающий без нарушения стилей курсора Ss / Se.
Стивен Лу

13

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

Для терминала GNOME (версия 2.26):

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 в KDE4:

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

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

См. Также: « Изменение формы курсора в разных режимах » на Vim Tips Wiki .


13
Я в основном использую vim в tmux поверх ssh с putty. Есть ли более универсальный вариант?
lanrat

Работал как шарм. Спасибо.
Эрнест

1
Изменение настроек gnome-terminal с помощью команды gconftool-2 - очень плохая идея. Это влияет не только на терминал, на котором запущен ваш vim, но и на все другие текущие и будущие вкладки gnome-terminal того же профиля.
egmont

это работает для консоли, спасибо. Но одна проблема заключается в том, что выход из режима вставки происходит медленно, не знаю почему,
Хоанг Тран

1
@HoangTran useset ttimeoutlen=0
Bananach

10

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

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


Это кажется наиболее разумным решением. Для этого должен быть: установлен прямо в VIM, стандарт.
user12711 09

Требования: gnome-terminal ( wiki.gnome.org/Apps/Terminal ) и другие терминалы, использующие библиотеку VTE ( github.com/GNOME/vte ): частично поддерживаются (например, поддерживает изменение формы курсора, но не создание отчетов о фокусе). В моем случае (gnome-terminal 3.6.2) он вообще не работает.
daGo

8

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

set guicursor+=n-v-c:blinkon0

2

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

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

Я хотел показать тонкую линию в качестве курсора в режиме вставки и обратно в блок в нормальном режиме, как это делает 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"

введите описание изображения здесь

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

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

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

исправить задержку возврата к блоку в виде курсора

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


1

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

Вот как выглядит соответствующий фрагмент из моего .vimrc:

    " Cursor appearance
    "
    " See also: [1]'ANSI Control Functions Summary', [2]DECSCUSR, [3]xterm+tmux
    "   entry in terminfo.src.
    " [1] https://www.vt100.net/docs/vt510-rm/chapter4.html
    " [2] https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
    " [3] https://raw.githubusercontent.com/mirror/ncurses/master/misc/terminfo.src
    "
    " On:
    " - entered insert mode
    let &t_SI = "^[[5 q^[]12;Magenta\007" " blinking bar (Ss) in magenta (Cs)
    " - entered replace mode
    let &t_SR = "^[[0 q^[]12;Red\007" " blinking block (Ss) in red (Cs)
    " - leaving insert/replace mode
    let &t_EI = "^[[2 q^[]112\007" " terminal power-on style (Se) and colour (Cr)

Примечание. На '^['самом деле символы представляют собой один ESCуправляющий символ (escape-последовательность).


0

Это правильно работает на 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-terminal сохраняет настройки в .config/xfce4/terminal/terminalrcфайле. Сценарий меняется TERMINAL_CURSOR_SHAPE_BLOCKна, TERMINAL_CURSOR_SHAPE_IBEAMкогда вы находитесь в режиме вставки, и обратно на блокировку, когда вы выходите из режима вставки или vim. Не стесняйтесь изменять IBEAMвсе , что вы хотите ( BLOCK, IBEAMи UNDERLINEдоступен).


0

Если вы используете современную версию 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

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

Tui-курсор-форма

гикурсор


-2

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

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


46
Как это отвечает на вопрос?
Дэвид Риверс,

1
@DavidRivers Это приложение проблемы XY, где OP запрашивал решение своей проблемы (не зная о том, что он находится в нормальном режиме vim и хочет, чтобы курсор изменился, чтобы указать на это), но оказался удовлетворенным альтернативой (а IMO не отличное) решение (усиление его статусной линии с помощью государства)
Стивен Лу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.