Хотя есть хитрости для решения этой проблемы (например, сопоставления ESC , упомянутые в предыдущих двух постах), последовательного способа сделать это не существует. Причина в том, что нет способа определить метод, который использовался для входа в режим вставки. В частности, с учетом строки abcDefg
с курсором на D
:
Если вы нажмете i , положение режима вставки будет между c
и D
. Обычный ESC поместит курсор на c
; <C-O>:stopinsert<CR>
(или метод backtick) установит курсор на 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.