Although there are tricks to deal with this (such as the ESC mappings mentioned in the previous two posts), there's no consistent way to do this. The reason is that there is no way to determine the method that was used to enter insert mode. Specifically, given the string abcDefg
with the cursor on the D
:
If you press i, the insert mode location will be between the c
and D
. A normal ESC will put the cursor on c
; <C-O>:stopinsert<CR>
(or the backtick method) will put the cursor on D
.
If you press a, the insert mode location will be between the D
and e
. A normal ESC will put the cursor on D
; <C-O>:stopinsert<CR>
will put the cursor on e
.
If you REALLY want to do this, you could fudge it with something like this:
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
BUT: remember that this will only deal with i
and a
as methods of entry: if you use visual block mode, I
, or A
or whatever, you'll need to come up with new commands to match (and there are a lot of them). Therefore, I'd strongly recommend you don't do this.
Personally, I'd recommend getting used to the default behaviour. You can easily make it logical for i
OR logical for a
. If you change the default to logical for i
at the expense of logical for a
, you'll just get confused when you use a standard vi/vim install.