如何防止光标在离开Vim的插入模式时向后移动一个字符?

如何防止光标在离开Vim的插入模式时向后移动一个字符?,vim,cursor-position,Vim,Cursor Position,是否有可能取消上述行为 额外积分的任务:找出一种方法,在退出插入模式后立即强制Vim刷新光标位置。inoremap:stopinsert inoremap <silent> <Esc> <C-O>:stopinsert<CR> 在您的.vimrcinoremap:stopinsert中 在您的.vimrc中,关于: :imap <Esc> <Esc><Right> :imap 关于: :imap <

是否有可能取消上述行为

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

inoremap:stopinsert
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
在您的
.vimrc

inoremap:stopinsert中
在您的
.vimrc

中,关于:

:imap <Esc> <Esc><Right>
:imap
关于:

:imap <Esc> <Esc><Right>
:imap

尽管我不建议更改默认的光标机制, 实现所讨论行为的一种方法是使用以下命令 插入模式映射

:inoremap <silent> <Esc> <Esc>`^
:inoremap`^
在此,Esc键在插入模式下重载,以增加 运行
`^
命令,将光标移动到其所在的位置 这是最后一次离开插入模式。因为在这个映射中 在Esc退出插入模式后立即执行, 与光标的位置相比,光标向左向右移动一个字符 具有默认行为的位置

与其他一些解决方案不同,此解决方案不需要安装Vim
使用
+ex_extra
功能编译。

尽管我不建议更改默认的光标机制, 实现所讨论行为的一种方法是使用以下命令 插入模式映射

:inoremap <silent> <Esc> <Esc>`^
:inoremap`^
在此,Esc键在插入模式下重载,以增加 运行
`^
命令,将光标移动到其所在的位置 这是最后一次离开插入模式。因为在这个映射中 在Esc退出插入模式后立即执行, 与光标的位置相比,光标向左向右移动一个字符 具有默认行为的位置

与其他一些解决方案不同,此解决方案不需要安装Vim
使用
+ex_extra
功能编译。

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

  • 如果按i键,插入模式位置将在
    c
    D
    之间。正常ESC将光标置于
    c
    <代码>:stopinsert(或反勾选方法)将光标置于
    D

  • 如果按a键,插入模式位置将在
    D
    e
    之间。正常ESC将光标置于
    D
    <代码>:stopinsert将光标放在
    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
let insert\u命令=“inoremap:stopinsert”
让我们附加命令=“iunmap”
nnoremap i:exe插入命令i
nnoremap a:exe追加命令a
但是:请记住,这将只处理
i
a
作为输入方法:如果您使用视觉块模式、
i
a
或其他任何方式,您将需要提出新的命令来匹配(它们有很多)。因此,我强烈建议你不要这样做


就个人而言,我建议大家习惯默认的行为。您可以轻松地将其设置为符合逻辑的
i
或符合逻辑的
a
。如果您将默认值更改为logical for
i
,而牺牲了logical for
a
,那么在使用标准vi/vim安装时,您只会感到困惑。

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

  • 如果按i键,插入模式位置将在
    c
    D
    之间。正常ESC将光标置于
    c
    <代码>:stopinsert(或反勾选方法)将光标置于
    D

  • 如果按a键,插入模式位置将在
    D
    e
    之间。正常ESC将光标置于
    D
    <代码>:stopinsert将光标放在
    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
let insert\u命令=“inoremap:stopinsert”
让我们附加命令=“iunmap”
nnoremap i:exe插入命令i
nnoremap a:exe追加命令a
但是:请记住,这将只处理
i
a
作为输入方法:如果您使用视觉块模式、
i
a
或其他任何方式,您将需要提出新的命令来匹配(它们有很多)。因此,我强烈建议你不要这样做


就个人而言,我建议大家习惯默认的行为。您可以轻松地将其设置为符合逻辑的
i
或符合逻辑的
a
。如果您将默认值更改为logical for
i
而牺牲了logical for
a
,那么在使用标准vi/vim安装时,您只会感到困惑。

我相信正确的方法是

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

我相信正确的方法是

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
基于此,我发现最好的方法是

autocmd InsertLeave * :normal `^
set virtualedit=onemore
autocmd
将光标移回插入模式结束时的位置(即与默认值相比向前移动一次)

virtualedit
使它在行尾动作一致(因此它可以是行中最后一个字符的前一个字符)。

基于此,我找到的最佳方法是

autocmd InsertLeave * :normal `^
set virtualedit=onemore
autocmd
将光标移回插入模式结束时的位置(即与默认值相比向前移动一次)

virtualedit