当我按 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 Vim,my own .vimrc.local
on top of it。我还使用Vundle安装了several additional plugins。
注意: .vimrc.local
来自.vimrc
的最后一个。
答案 0 :(得分:12)
我找到了一个更好的解决方案,而不是试图从文档的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)