防止游标在插入模式退出时向后移动一个字符

时间:2010-02-19 10:06:42

标签: vim cursor-position

......你会怎么做?

额外学分的任务:找出一种方法来强制vim在退出插入模式后立即刷新光标位置

6 个答案:

答案 0 :(得分:21)

虽然我不建议更改默认光标机制,但有一种方法 实现相关行为是使用以下插入模式 映射。

:inoremap <silent> <Esc> <Esc>`^

这里 Esc 键在插入模式下重载以进行额外运行 ``^`命令将光标移动到最后一个位置 时间插入模式已停止。因为在这个映射中它被执行 在使用 Esc 离开插入模式后立即离开光标 与其默认行为的位置相比,右侧有一个字符。

与其他一些变通方法不同,这个变通方法不需要编译Vim 使用+ex_extra功能。

答案 1 :(得分:17)

虽然有一些技巧可以解决这个问题(例如前两篇文章中提到的 ESC 映射),但是没有一致的方法可以解决这个问题。原因是无法确定用于进入插入模式的方法。具体来说,给定字符串abcDefg,光标位于D

  • 如果按 i ,插入模式位置将介于cD之间。正常的 ESC 会将光标放在c上; <C-O>:stopinsert<CR>(或反引号方法)会将光标放在D上。

  • 如果按 a ,插入模式位置将介于De之间。正常的 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

但是:请记住,这只会将ia视为输入方法:如果您使用视觉阻止模式,IA或其他,你需要提出匹配的新命令(并且有很多这些命令)。因此,我强烈建议你不要这样做。

就个人而言,我建议习惯默认行为。您可以轻松地为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>