Як змінити курсор між режимами Normal та Insert у Vim?


106

Мені хотілося б знати, як можна змінити курсор у Vim (за кольором, формою тощо) залежно від того, в якому режимі ви перебуваєте.

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


19
Я пропоную вам вивчити одне правило: припинено набирати => режим вставки. Тоді ви ніколи не спостерігатимете ситуацію, коли ви забули, що не перебуваєте в режимі вставки.
ZyX

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

3
@ZyX це прекрасне правило, і я завжди це робив, але візуальні показники все ще важливі. Марихуана зараз легальна, і я забуваю, що я роблю весь час.
Felwithe

Відповіді:


107

Популярним варіантом вказівки на перехід у режим Вставлення та з нього є перемикання cursorlineпараметра, яке відповідає за те, чи підсвічується поточна лінія екрана (див. :help cursorline):

:autocmd InsertEnter,InsertLeave * set cul!

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

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

Змініть CursorLineгрупу виділення, щоб змінити стилізацію лінії курсору на ваш смак (див. :help :highlightТа :help highlight-groups).


5
Я також встановив культу високим bg замість того, що за замовчуванням підкреслюють: привіт CursorLine cterm = НІКОЛИ ctermbg = чорний
Микита Прокопов

Чи є причина, що це не спрацювало б із цигвіном? Я в редакторі і ввів обидва набори рядків, і мені не вдалося встановити будь-яке виділення, поза повним стовпчиком або підсвічуванням рядків
TankorSmash

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

Звичайно, збережіть це у ~ / .vimrc для постійності, як zo:echo 'autocmd InsertEnter,InsertLeave * set cul!' >>~/.vimrc
алхімія

75

Наступні роботи в 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-терміналі
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
рішення має значну затримку зміни форми з режиму вставки до звичайного режиму на простому терміналі (без смоктання)
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.
Steven Lu

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 із шпаклівкою. Чи є універсальніший варіант?
lanrat

Працював як шарм. Дякую.
Ернест

1
Зміна налаштувань gnome-терміналу за допомогою команди gconftool-2 - дуже погана ідея. Це впливає не тільки на термінал, де працює ваш vim, але й на всі інші поточні та майбутні вкладки gnome-терміналу того ж профілю.
Егмонт

це працює для konsole, дякую. Але одне питання полягає в тому, що вихід із режиму вставки є slooow, не впевнений, чому
Hoang Tran

1
@HoangTran використанняset ttimeoutlen=0
Bananach

10

Ви можете спробувати плагін Terminus Vim :

У режимі вставки форма курсору змінюється на тонку вертикальну смужку. У режимі заміни він змінюється на підкреслення. Повернувшись до звичайного режиму, він повертається до стандартної «блокової» форми.


Це здається найбільш розумним рішенням. Повинно бути встановлено: встановити для цього безпосередньо у VIM, стандарт.
користувач12711

Вимоги: 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керуючий символ (послідовність втечі).


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 на статус статус, серед іншого. Якщо ви прагнете простоти, ви можете встановити лише цю інформацію на статус стану .

Однак, як правило, справді божевільні речі трапляються, коли у вас зафіксовано блокування кепки і перебуваєте в командному режимі (оскільки hjkl зараз є HJKL - достатньо лише J і K, щоб ви витягли волосся, коли ви не розумієте, що відбувається. Зробіть a :h Jі :h Kщоб побачити, що я маю на увазі). Просто остерігайтеся клавіші блокування шапки, і ви будете добре все час ІМО.


46
Як це відповідає на питання?
Девід Ріверс

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