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

Jul*_*usz 33 vim cursor-position

你怎么做的?

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

ib.*_*ib. 21

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

:inoremap <silent> <Esc> <Esc>`^
Run Code Online (Sandbox Code Playgroud)

这里的Esc键在插入模式下被重载以另外运行``^`命令,该命令将光标移动到最后一次插入模式停止的位置.由于在此映射中它在离开插入模式后立即执行Esc,因此与具有默认行为的位置相比,光标在右侧保留一个字符.

与其他一些解决方法不同,这个解决方案不需要使用该+ex_extra功能编译Vim .

  • 不幸的是,当按下箭头键和功能键时,此解决方案会在终端中弄乱Vim.我现在正在尝试修复此问题:`autocmd InsertLeave*:normal \`^` (7认同)

DrA*_*rAl 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
Run Code Online (Sandbox Code Playgroud)

但是:请记住,这只会处理i,并a作为入门的方法:如果你使用可视块模式,IA或什么的,你需要拿出新的命令,以匹配(也有很多他们).因此,我强烈建议你不要这样做.

就个人而言,我建议习惯默认行为.您可以轻松地使i OR逻辑为逻辑a.如果你以i牺牲逻辑for为代价将默认值更改为logical a,那么当你使用标准的vi/vim安装时,你会感到困惑.


Mik*_*kel 9

根据Nathan Neff 的 评论,我发现的最佳方法是

autocmd InsertLeave * :normal! `^
set virtualedit=onemore
Run Code Online (Sandbox Code Playgroud)

autocmd 将光标移回插入模式结束时的位置(即与默认值相比向前移动一个)。

virtualedit 使其在行尾保持一致(因此它可以位于行中最后一个字符的前面)。

(编辑:normal!避免递归映射)


tur*_*1ng 7

inoremap <silent> <Esc> <C-O>:stopinsert<CR>
Run Code Online (Sandbox Code Playgroud)

在你的.vimrc中

  • 好吧,你可以重新映射正常模式`i`来设置一个标志,然后重新映射插入模式`<Esc>`来检查那个标志,如果设置,使用`<CO>:stopinsert <CR>`,然后清除标志无论哪种方式. (2认同)
  • 我不相信这对于“a”来说是完全不合逻辑的。一般来说,每次更改之后,当我离开该更改时,我就完成了该更改,并且我想做的下一件事可能会涉及进行不同的更改。因此,对我来说,在离开插入模式时(无论我如何进入),我通常更喜欢光标位于下一个字符上,这样我就可以准备下一次更改,而不是准备更改我刚刚的内容插入。(大部分复制自我的评论:http://unix.stackexchange.com/a/11403/38050) (2认同)