如何防止<esc>在插入模式下等待更多输入</esc>

时间:2012-11-15 19:21:00

标签: vim configuration keyboard-shortcuts

当我按 Esc 离开插入模式时,在Vim实际返回正常模式之前有半秒的暂停。

通常这不是问题,因为在按下 Esc 之后按下正常模式命令如 j 会立即执行正常模式命令(没有上述提到)等待),但我有映射inoremap <Esc> <Esc>:w<CR>,所以每次我离开插入模式时都会写入文件。当我按 Esc 时,我希望写入立即发生,而是暂停半秒。

我假设暂停是因为Vim在决定我只想输入单个简单的 Esc 之前等待更多输入。这一定是因为某个地方的第一个角色是<Esc>,但我查看了我的.vimrc并且没有这样的映射。

此外,我甚至运行:map <Esc>,并返回No such mapping。所以,如果没有这样的映射,为什么Vim似乎在等待更多的输入,我怎么能避免这种行为?


额外信息

看起来这是不可复制的,所以这里有一些更多的信息,以防任何人真正想要深究这一点:

我正在使用Steve Francia's spf13 distribution of Vimmy own .vimrc.local on top of it。我还使用Vundle安装了several additional plugins

注意: .vimrc.local来自.vimrc的最后一个。

4 个答案:

答案 0 :(得分:12)

更新(2014年3月19日)

我找到了一个更好的解决方案,而不是试图从文档的Powerline部分搜索以<Esc>开头的.vimrc开头的所有映射。把它放在 " leave insert mode quickly if ! has('gui_running') set ttimeoutlen=10 augroup FastEscape autocmd! au InsertEnter * set timeoutlen=0 au InsertLeave * set timeoutlen=1000 augroup END endif

的某个地方
<Esc>

请注意,这将使得在插入模式下无法使用以.vimrc开头的映射,但不管怎样都不应该有这些映射,因为这解决了这个问题。


我在spf13的" Fix home and end keybindings for screen, particularly on mac " - for some reason this fixes the arrow keys too. huh. map ^[F $ imap ^[F $ map ^[H g0 imap ^[H g0 中找到导致问题的行:

<Esc>

之前我找不到它们的原因是因为它们没有使用^[进行映射,而是使用:verbose map <Esc>进行映射。很烦人!希望这有助于一些同样心怀不满的spf13用户:)

<强>更新

如果删除这些映射不起作用,那么它可能是插件的映射。

键入verbose以获取涉及 Esc 的所有映射的列表。 unmap <Esc>部分指示Vim打印设置映射的位置。这应该有助于找出造成问题的原因。

此外,命令unmap可能很有用 - 它会删除 Esc 键的所有映射。

请注意,:h unmap不会删除所有模式中的映射;输入{{1}}了解详情。

答案 1 :(得分:8)

在我的情况下,这是tmux注入延迟(这对我来说完全是一个惊喜!)。

我通过将set -g escape-time 0添加到tmux.conf来修复它。

这可能并不能严格帮助作者,但在使用许多不同的关键字组合搜索此问题时,首先会出现此问题,因此我希望它可以帮助某人。

来源:来自here的第一条评论。

答案 2 :(得分:7)

我不确定你描述的映射问题是什么,在我看来应该没问题。但是,我认为你想要实现的目标可以更好地达成。你的映射基本上是尝试创建一个InsertLeave事件,Vim实际上已经内置了它!

尝试将这样的内容添加到.vimrc

au InsertLeave * if &mod && expand('%')!=''|write|endif

作为一个额外的好处,如果它有一个文件名并且实际被修改了,那么这个只保存你的缓冲区。

答案 3 :(得分:0)

set timeoutlen=1000 ttimeoutlen=0

timeoutlen-映射延迟。

ttimeoutlen-关键代码延迟。

Source