如何防止光标在离开Vim的插入模式时向后移动一个字符?
是否有可能取消上述行为 额外积分的任务:找出一种方法,在退出插入模式后立即强制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 <
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
之间。正常ESC将光标置于D
<代码>:stopinsert(或反勾选方法)将光标置于c
D
- 如果按a键,插入模式位置将在
和D
之间。正常ESC将光标置于e
<代码>:stopinsert将光标放在D
上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 fori
,而牺牲了logical fora
,那么在使用标准vi/vim安装时,您只会感到困惑。尽管有一些技巧可以解决这个问题(如前两篇文章中提到的ESC映射),但没有一致的方法可以做到这一点。原因是无法确定用于进入插入模式的方法。具体来说,给定光标位于D
上的字符串abcDefg
:
- 如果按i键,插入模式位置将在
和c
之间。正常ESC将光标置于D
<代码>:stopinsert(或反勾选方法)将光标置于c
D
- 如果按a键,插入模式位置将在
和D
之间。正常ESC将光标置于e
<代码>:stopinsert将光标放在D
上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 fori
而牺牲了logical fora
,那么在使用标准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