为什么光标移到<Esc>之后的行的开头?


12

我注意到在插入模式下沿.txt文件中的一行进行编辑时,光标将在使用键序列进行写操作后移至该行的开头:

<esc>:w

我想更改此行为,以使光标在:write之后将保持在原位。这可能吗?我不需要光标保持在插入模式,我只希望它在写入后保持其最后位置。

我在Windows上使用gVim 7.4。我的.vimrc非常基本,我不相信任何设置都会干扰此行为。我还从我的.vimrc中删除了mswin.vim和example.vim的采购(与正式的vim.org Windows安装程序捆绑在一起)。

阅读下面的评论后,我再次查看了该问题,并意识到在写入完全由尾部空白组成的行之后,光标仅滑至最左侧。换句话说,当该行是一个悬挂缩进时,除了空格之外,没有其他任何字符时,光标只会滑动到esc-:w的最左侧。.vimrc正在使用以下设置处理缩进行为:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

因此,在缩进线下方创建的新行将包含4个尾随空白,作为该行的前4个空格(我要保留)。按下“ esc”键时,光标将滑动到缓冲区的最左端。

在尾随空白(如缩进)组成的一行上,单击“ esc”以返回正常模式时,是否可以保留光标位置?


3
我从未在任何平台上的Vim中注意到这种行为...如果启动gVim时会发生什么:(gvim -u NONE -U NONE可以使用cmd.exe,也可以创建快捷方式)?这将防止加载您的(g)vimrc文件。
马丁·图尔诺伊

1
那是您完整的 vimrc文件吗?我的第一个怀疑是vimrc文件中的autocmd正在删除结尾的空格。在没有任何vimrc文件的情况下启动gVim时,行为是否会改变(请参见上面的注释)?
马丁·图尔诺伊

上面不是我完整的.vimrc,还有其他设置。运行不带.vimrc的gVim(:scriptnames显示没有.vimrc或.gvimrc)解决了我的问题。您是完全正确的,我需要查看我的.vimrc或其他可能导致此问题的来源。
吉姆(Jim)

显然,消除换行符是一种可取的行为,我在这里阅读它的意思是保持文件不带空格。
吉姆(Jim)

那是关于打开新行……不是关于写入文件?
马丁·图尔诺伊

Answers:


11

查看有关自动缩进的文档,可以找到为什么以及如何解决该问题的答案。:help 'autoindent'

在开始新行时(<CR> 在插入模式下键入或使用“ o”或“ O”命令时),从当前行复制缩进。如果你不只是键入新线东西<BS>CTRL-D然后键入 <Esc>CTRL-O或者<CR>,缩进又被删除。除非将'I'标志包括在'cpoptions'中,否则将光标移动到另一行具有相同的效果。

换言之,如果你想让它不输缩进式的东西,然后退格键删除它之前击中Esc,以及领先的空间仍然存在。

另外,如果您只想在返回插入模式并使用时又回到缩进级别'cindent',请使用Shift-S代替代替i,这将清除(已经为空)行,并从适当的缩进级别开始。这不像上面的解决方案那样普遍,但是我在编写C代码时更喜欢这种解决方案,这样我的文件实际上就不会用仅空格行保存。


这是原始文档对我的问题的肯定答案。感谢您的总结和叙述-我不会想到要使用:h autoindent来获取此信息。也感谢@Carpetsmoker的讨论,提出了解决方案。
吉姆(Jim)

这解决了我涉及重新映射o和O而不退出插入模式,而是保持缩进的问题。这可以通过执行以下操作来完成nnoremap o o <BS><Esc><DEL>,以及nnoremap O O <BS><Esc><DEL>
Max Coplan

非常感谢!
Max Coplan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.