【发布时间】:2011-09-27 15:26:53
【问题描述】:
现在在 Vim 中,当我换行时(或在正常模式下按 'p' 或 'o'),我得到一个可爱的自动缩进,如果我退出插入模式而不添加任何内容,它也会消失。
有没有办法在我退出插入模式之前绑定一些东西,例如插入一个幻象字符然后删除它?
【问题讨论】:
标签: vim indentation esc-key
现在在 Vim 中,当我换行时(或在正常模式下按 'p' 或 'o'),我得到一个可爱的自动缩进,如果我退出插入模式而不添加任何内容,它也会消失。
有没有办法在我退出插入模式之前绑定一些东西,例如插入一个幻象字符然后删除它?
【问题讨论】:
标签: vim indentation esc-key
啊,我两天前刚读到这个确切的东西,但我不记得在哪里。
无论如何,诀窍是在<CR> 之后输入一个字符并立即删除它。有很多方法可以做到:
<CR>a<Esc>x
<CR>a<C-w>
<CR>a<BS>
--EDIT--
Vim 就是 Vim 可能还有很多其他方式。
要使这些自动化,您需要将映射添加到您的 .vimrc:
inoremap <CR> <CR>a<BS> " insert mode mapping for <CR>
nnoremap o oa<BS> " normal mode mapping for o
但我不确定您是否应该像这样覆盖默认值。
--EDIT--
但是,Vim 的默认行为令人讨厌的是,您可能需要在实际在非缩进行上输入一些文本之前执行一些 <Tab><Tab><Tab><Tab> 或在完成后执行 == 或依赖自动缩进规则您的语言在下一个<CR>。
使用<S-S> 可以跳过所有内容,这会将您置于正确缩进级别的INSERT 模式。
【讨论】:
p 代表“put”,p 之后不会进入 INSERT 模式。你试过我的三个建议了吗?你试过<S-s>吗?还有你为什么在o之后<Esc>?如果您想要一个空白行来分隔代码块,那么行首是否存在空白并不重要,不是吗?你确定oa<BS> 在那个用例中不起作用吗? tabstop、softtabstop、expandtab、shiftwidth、shiftround 和 smarttab 的设置是什么?
在正常模式下尝试cc 或S 以更改与缩进相关的行。不需要幻影字符。
:h cc
:h S
【讨论】:
像下面这样的映射应该可以解决问题:
imap <esc> <esc>:s/\s\+$//<CR>
当您在插入模式下按 esc 时,这会删除尾随字符。
【讨论】: