39

是否可以取消上述行为?

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

4

7 回答 7

27

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

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

这里Esc键在插入模式下被重载,以额外运行将`^ 光标移动到上次离开插入模式的位置的命令。由于在此映射中,它在离开插入模式后立即执行Esc,与默认行为相比,光标向右左一个字符。

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

于 2010-02-19T12:31:28.040 回答
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

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

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

于 2010-02-19T12:32:33.390 回答
10

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

autocmd InsertLeave * :normal! `^
set virtualedit=onemore

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

virtualedit使其在行尾始终如一地运行(因此它可以是该行最后一个字符的前一个字符)。

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

于 2018-11-26T16:14:17.817 回答
8
inoremap <silent> <Esc> <C-O>:stopinsert<CR>

在你的.vimrc.

于 2010-02-19T10:09:54.880 回答
4

我相信正确的方法是

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
于 2013-06-11T21:57:56.680 回答
1

Vim Tips wiki中的一种方法对我来说效果很好......我不知道多少年了:

" Leave insert mode to the *right* of the final location of the insertion
" pointer
" From http://vim.wikia.com/wiki/Prevent_escape_from_moving_the_cursor_one_character_to_the_left
let CursorColumnI = 0 "the cursor column position in INSERT
autocmd InsertEnter * let CursorColumnI = col('.')
autocmd CursorMovedI * let CursorColumnI = col('.')
autocmd InsertLeave * if col('.') != CursorColumnI | call cursor(0, col('.')+1) | endif
于 2021-10-20T19:06:48.650 回答
0

关于什么:

:imap <Esc> <Esc><Right>
于 2010-02-19T10:10:13.240 回答