Подтвердить что ты не робот

Не позволяйте курсору перемещать один символ в режиме вставки

... как бы вы это сделали?

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

4b9b3361

Ответ 1

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

:inoremap <silent> <Esc> <Esc>`^

Здесь клавиша Esc перегружена в режиме Вставки для дополнительного запуска `` `` команда, которая перемещает курсор в позицию, где она была последней режим вставки времени был остановлен. Так как в этом отображении выполняется сразу после выхода из режима вставки с Esc, курсор остается один символ вправо по сравнению с его положением с поведением по умолчанию.

В отличие от некоторых других обходных решений, этот не требует компиляции Vim с функцией +ex_extra.

Ответ 2

Хотя есть уловки для решения этой проблемы (например, сопоставления ESC, упомянутые в предыдущих двух сообщениях), нет последовательного способа сделать это. Причина в том, что нет способа определить метод, который использовался для входа в режим вставки. В частности, с учетом строки abcDefg с помощью курсора на D:

  • Если вы нажмете i, расположение режима вставки будет находиться между c и D. Обычный ESC поместит курсор на c; <C-O>:stopinsert<CR> (или метод обратного хода) поместит курсор на D.

  • Если вы нажмете a, расположение режима вставки будет находиться между D и e. Нормальный ESC поместит курсор на D; <C-O>:stopinsert<CR> поместит курсор на e.

Если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вы можете выдумать что-то вроде этого:

let insert_command = "inoremap <ESC> <C-O>:stopinsert<CR>"
let append_command = "iunmap <ESC>"
nnoremap i :exe insert_command<CR>i
nnoremap a :exe append_command<CR>a

НО: помните, что это будет работать только с i и a как методы ввода: если вы используете режим визуального блока, i или a или что-то еще, вам нужно придумать новые команды для сопоставления (и их много). Поэтому я настоятельно рекомендую вам не делать этого.

Лично я рекомендую привыкнуть к поведению по умолчанию. Вы можете легко сделать его логичным для i ИЛИ логического для a. Если вы измените значение по умолчанию на логическое для i за счет логического для a, вы просто запутаетесь при использовании стандартной установки vi/vim.

Ответ 3

inoremap <silent> <Esc> <C-O>:stopinsert<CR>

в вашем .vimrc

Ответ 4

Я считаю, что правильный способ сделать это -

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

Ответ 5

Как насчет:

:imap <Esc> <Esc><Right>