Vim预退出(Esc键)命令是什么?

5

目前在 Vim 中,当我到达一个新行(或在正常模式下按 'p' 或 'o')时,会出现一个可爱的自动缩进,当我退出插入模式而没有添加任何内容时,它也会消失。

是否有一种方法可以绑定在我退出插入模式之前执行某些操作,例如插入一个幻像字符然后将其删除?


1
请参阅“如何防止Vim删除空行缩进”。 - ib.
3个回答

2

啊,我两天前刚看到这个东西,但是我不记得在哪里看到了。

无论如何,诀窍是在<CR>后立即输入一个字符并立即删除它。有很多方法可以做到:

<CR>a<Esc>x
<CR>a<C-w>
<CR>a<BS>

--编辑--

由于Vim非常灵活,可能还有许多其他的方法。

要自动化这些操作,您需要在您的 .vimrc 文件中添加一个映射:

inoremap <CR> <CR>a<BS> " insert mode mapping for <CR>
nnoremap o oa<BS>       " normal mode mapping for o

但我不确定你是否应该这样覆盖默认设置。

--编辑--

然而,Vim的默认行为很烦人,因为你可能需要在非缩进行上输入一些文本之前进行一些<Tab><Tab><Tab><Tab>或者在完成后使用==,或者依赖于下一个<CR>时自动缩进规则。

通过使用<S-S>,所有这些都可以跳过,直接将你放入正确的缩进级别并进入插入模式。


奇怪的是,即使按下 Esc 键,Vim 仍会删除空格,在使用“p”或“o”进入插入模式时也不起作用。 - Jookia
p代表“put”,在使用p后不需要进入INSERT模式。你试过我的三个建议吗?你尝试过<S-s>吗?还有,为什么在使用o之后要按<Esc>?如果你想在代码块之间插入空白行,则行首是否有空格并不重要,对吗?你确定在这种情况下oa<BS>无法使用吗?你的tabstopsofttabstopexpandtabshiftwidthshiftroundsmarttab设置是什么? - romainl
我不太确定如何使用你的命题。添加一个字符然后再删除它可以起作用,但我不确定如何自动化它。 - Jookia

2

在正常模式下,尝试使用ccS来根据缩进更改一行。无需虚拟字符。

:h cc
:h S

2
我支持这个。不要试图克服不是偶然的正常 Vim 行为。通常,只包含空格的行(这是带有尾随空格的行的特殊情况)在代码中是不需要的(例如,Linux 编码风格注意避免这种情况)。 - ib.
对我来说,它似乎只是缺乏一致性而不是良好的实践。是否有一些论文显示其优点? - Jookia
其实我同意ib和Peter的观点。通常来说,覆盖默认行为是一个不好的想法,因为你可能会在某一天使用别人或者服务器上的旧版Vim。Vim中的每个功能都经过了精心设计,并且已经存在很长时间了。这就是我在我的回答和评论中所提到的。 - romainl

1
一个类似以下的映射应该可以解决问题:
imap <esc> <esc>:s/\s\+$//<CR>

这个功能可以在插入模式下按下 esc 键后删除末尾的字符。


啊,我有点想要尾随的字符。 - Jookia
我为你编写的映射只是一个示例。你可以根据实际需要进行调整。 - lucapette
那是退出后的事情,而不是退出前。 - Jookia
好的。这只是一个示例,展示了如何重新映射 esc 以实现您想要的功能。所以它是“后置退出”,因为我是这样写的,但如果您想要其他内容,只需修改映射即可 ;) - lucapette

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接