15

当我按 退出插入模式时Esc,在 Vim 真正返回正常模式之前会有半秒的暂停。

通常这不会是一个问题,因为按下正常模式命令就像j按下后Esc立即执行正常模式命令(没有上述等待),但我有映射inoremap <Esc> <Esc>:w<CR>,所以每次我离开插入模式文件是写的。我希望在按下时立即Esc写入,但会有半秒的停顿。

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

此外,我什至跑了:map <Esc>,它又回来了No such mapping。那么,如果没有这样的映射,为什么 Vim 似乎在等待更多输入,我该如何避免这种行为?


额外的信息

看来这是不可复制的,所以这里有一些更多信息,以防有人真的想深入了解:

我正在使用Steve Francia 的spf13Vim 发行版,上面我自己.vimrc.local的发行版。我还使用 Vundle安装了几个额外的插件。

注: .vimrc.local最后出自.vimrc.

4

4 回答 4

16

更新(2014 年 3 月 19 日)

我找到了一个比试图从文档的提示和技巧部分寻找所有<Esc>Powerline开头的映射更好的解决方案。把它放在你的某个地方:.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>while 在插入模式下开头的映射,但无论如何都不应该有任何映射,因为这解决了问题。


我在 spf13 中找到了.vimrc导致问题的行:

" 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>,而是使用映射的^[。很烦人!希望这可以帮助一些同样心怀不满的 spf13 用户:)

更新:

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

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

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

请注意,unmap不会删除所有模式下的映射;键入:h unmap以获取更多信息。

于 2012-11-21T02:08:09.227 回答
9

就我而言,是 tmux 注入了延迟(这对我来说完全是一个惊喜!)。

我通过添加set -g escape-time 0到我的tmux.conf.


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


资料来源:来自这里的第一条评论。

于 2016-02-14T09:40:19.003 回答
7

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

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

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

作为一个额外的好处,这个只有当它有一个文件名并且被实际修改时才会保存你的缓冲区。

于 2012-11-15T19:47:26.187 回答
0
set timeoutlen=1000 ttimeoutlen=0

timeoutlen- 映射延迟。

ttimeoutlen- 关键代码延迟。

来源

于 2020-03-23T14:41:06.613 回答