是否可以取消上述行为?
一个额外的任务:找出一种方法来强制 Vim 在退出插入模式后立即刷新光标位置。
尽管我不建议更改默认游标机制,但实现相关行为的一种方法是使用以下插入模式映射。
:inoremap <silent> <Esc> <Esc>`^
这里Esc键在插入模式下被重载,以额外运行将`^
光标移动到上次离开插入模式的位置的命令。由于在此映射中,它在离开插入模式后立即执行Esc,与默认行为相比,光标向右左一个字符。
与其他一些变通方法不同,此变通方法不需要使用该+ex_extra
功能编译 Vim。
虽然有一些技巧可以解决这个问题(例如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
其他方式,您将需要提出新的命令来匹配(并且有很多)。因此,我强烈建议您不要这样做。
就个人而言,我建议习惯默认行为。您可以轻松地将其逻辑 for i
OR逻辑 for a
。如果您以i
牺牲逻辑 for 为代价将默认值更改为逻辑 for a
,那么在使用标准 vi/vim 安装时您会感到困惑。
根据Nathan Neff 的 评论,我发现的最佳方法是
autocmd InsertLeave * :normal! `^
set virtualedit=onemore
autocmd
将光标移回插入模式结束时的位置(即与默认值相比向前移动)。
virtualedit
使其在行尾始终如一地运行(因此它可以是该行最后一个字符的前一个字符)。
(编辑:normal!
避免递归映射)
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
在你的.vimrc
.
我相信正确的方法是
au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Vim Tips wiki中的一种方法对我来说效果很好......我不知道多少年了:
" Leave insert mode to the *right* of the final location of the insertion
" pointer
" From http://vim.wikia.com/wiki/Prevent_escape_from_moving_the_cursor_one_character_to_the_left
let CursorColumnI = 0 "the cursor column position in INSERT
autocmd InsertEnter * let CursorColumnI = col('.')
autocmd CursorMovedI * let CursorColumnI = col('.')
autocmd InsertLeave * if col('.') != CursorColumnI | call cursor(0, col('.')+1) | endif
关于什么:
:imap <Esc> <Esc><Right>