......你会怎么做?
额外学分的任务:找出一种方法来强制vim在退出插入模式后立即刷新光标位置
答案 0 :(得分:21)
虽然我不建议更改默认光标机制,但有一种方法 实现相关行为是使用以下插入模式 映射。
:inoremap <silent> <Esc> <Esc>`^
这里 Esc 键在插入模式下重载以进行额外运行 ``^`命令将光标移动到最后一个位置 时间插入模式已停止。因为在这个映射中它被执行 在使用 Esc 离开插入模式后立即离开光标 与其默认行为的位置相比,右侧有一个字符。
与其他一些变通方法不同,这个变通方法不需要编译Vim
使用+ex_extra
功能。
答案 1 :(得分:17)
虽然有一些技巧可以解决这个问题(例如前两篇文章中提到的 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
的{{1}} OR 逻辑使其合乎逻辑。如果您将a
的默认值更改为逻辑i
,那么在使用标准vi / vim安装时,您会感到困惑。
答案 2 :(得分:7)
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
你的.vimrc中的
答案 3 :(得分:3)
我确实认为正确的方法是
au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
答案 4 :(得分:2)
基于Nathan Neff's comment,我发现的最佳方法是
autocmd InsertLeave * :normal `^
set virtualedit=onemore
autocmd
将光标移回插入模式结束时的位置(即,与默认模式相比向前移)。
virtualedit
使其在行尾始终保持一致的行为(因此它可以是行中最后一个字符的前一个)。
答案 5 :(得分:0)
怎么样:
:imap <Esc> <Esc><Right>