... как бы вы это сделали?
задача для дополнительного кредита: выяснить способ заставить vim обновить позицию курсора сразу после выхода из режима вставки
... как бы вы это сделали?
задача для дополнительного кредита: выяснить способ заставить vim обновить позицию курсора сразу после выхода из режима вставки
Хотя я бы не рекомендовал менять механику курсора по умолчанию, один из способов достижение такого поведения заключается в использовании следующего режима Insert-mode отображение.
:inoremap <silent> <Esc> <Esc>`^
Здесь клавиша Esc перегружена в режиме Вставки для дополнительного запуска `` `` команда, которая перемещает курсор в позицию, где она была последней режим вставки времени был остановлен. Так как в этом отображении выполняется сразу после выхода из режима вставки с Esc, курсор остается один символ вправо по сравнению с его положением с поведением по умолчанию.
В отличие от некоторых других обходных решений, этот не требует компиляции Vim
с функцией +ex_extra
.
Хотя есть уловки для решения этой проблемы (например, сопоставления 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.
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
в вашем .vimrc
Я считаю, что правильный способ сделать это -
au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Как насчет:
:imap <Esc> <Esc><Right>