【问题标题】:Vim Pre-Exit (Esc Key) Command?Vim 预退出(Esc 键)命令?
【发布时间】:2011-09-27 15:26:53
【问题描述】:

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

有没有办法在我退出插入模式之前绑定一些东西,例如插入一个幻象字符然后删除它?

【问题讨论】:

标签: vim indentation esc-key


【解决方案1】:

啊,我两天前刚读到这个确切的东西,但我不记得在哪里。

无论如何,诀窍是在<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 的默认行为令人讨厌的是,您可能需要在实际在非缩进行上输入一些文本之前执行一些 &lt;Tab&gt;&lt;Tab&gt;&lt;Tab&gt;&lt;Tab&gt; 或在完成后执行 == 或依赖自动缩进规则您的语言在下一个&lt;CR&gt;

使用&lt;S-S&gt; 可以跳过所有内容,这会将您置于正确缩进级别的INSERT 模式。

【讨论】:

  • 奇怪的是,当按下 Esc Vim 时仍然会删除空格,这在使用 'p' 或 'o' 进入插入模式时也不起作用。
  • p 代表“put”,p 之后不会进入 INSERT 模式。你试过我的三个建议了吗?你试过&lt;S-s&gt;吗?还有你为什么在o之后&lt;Esc&gt;?如果您想要一个空白行来分隔代码块,那么行首是否存在空白并不重要,不是吗?你确定oa&lt;BS&gt; 在那个用例中不起作用吗? tabstopsofttabstopexpandtabshiftwidthshiftroundsmarttab 的设置是什么?
  • 我不确定如何使用您的建议。添加一个字符然后删除它是可行的,但我不确定如何自动化它。
【解决方案2】:

在正常模式下尝试ccS 以更改与缩进相关的行。不需要幻影字符。

:h cc
:h S

【讨论】:

  • 我支持这个。不要试图克服并非偶然的正常 Vim 行为。通常,仅包含空格的行(这是带有尾随空格的行的特殊情况)在代码中是不受欢迎的(例如,Linux 编码风格notices to avoid this)。
  • 在我看来只是缺乏一致性而不是好的做法。是否有一些论文显示了这些好处?
  • 其实我同意 ib 和 Peter 的观点。覆盖默认行为通常是一个坏主意,如果只是因为有一天您可能会在某些服务器上使用其他人的或股票/旧的 vim。 Vim 中的所有内容都经过深思熟虑,并且长期以来一直如此。这就是我在回答和 cmets 中提到的。
【解决方案3】:

像下面这样的映射应该可以解决问题:

imap <esc> <esc>:s/\s\+$//<CR>

当您在插入模式下按 esc 时,这会删除尾随字符。

【讨论】:

  • 啊。我有点想要尾随字符。
  • 我为你写的映射只是一个例子。您可以根据自己的实际需求进行调整
  • 这是退出后,而不是退出前。
  • 好的。这是一个例子。只是一种向您展示如何重新映射 esc 以执行您的操作的方法。所以它是“退出后”,因为我是这样写的,但如果你想要别的东西,你可以修改映射;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2011-04-29
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多