在Vim中,当处于可视模式时,我必须按两次 Esc 退出并关闭选择。按下 Esc 后,我必须等待2秒才能关闭选择。
键入 Esc 时,如何立即退出可视模式?
答案 0 :(得分:39)
执行以下命令帮助我
set timeoutlen=1000 ttimeoutlen=0
答案 1 :(得分:9)
正如Ingo解释的那样。我以为我会发布解决方案: https://github.com/Greduan/dotfiles/blob/47f92e4db29d4ead778d877a85082b271de130ed/vim/vimrc.vim#L332-L346
效果很好。这对我来说有点让人困惑,所以我无法解释,但代码解释得很好。
重点是它有效,即使在终端上,它也会立即使<Esc>
正常工作。我相信如果你确实将映射设置为<Esc>
,那么它也会给你时间来做这些事情。但是我不确定。
修改强>
研究了一下,我现在可以解释一下。基本上,如果您没有使用GUI(如MacVim),那么当您进入插入模式时,ttimeoutlen
将被设置为0.这意味着只要您单击<Esc>
即可。但是,一旦您处于正常模式,它就会将ttimeoutlen
设置为您喜欢的数字,让您与<Esc>
进行映射。
我认为完美的解决方案,因为如果你在插入模式下有映射,它将使用控件或类似的东西。
编辑2
以下是代码:
set timeout " Do time out on mappings and others
set timeoutlen=2000 " Wait {num} ms before timing out a mapping
" When you’re pressing Escape to leave insert mode in the terminal, it will by
" default take a second or another keystroke to leave insert mode completely
" and update the statusline. This fixes that. I got this from:
" https://powerline.readthedocs.org/en/latest/tipstricks.html#vim
if !has('gui_running')
set ttimeoutlen=10
augroup FastEscape
autocmd!
au InsertEnter * set timeoutlen=0
au InsertLeave * set timeoutlen=1000
augroup END
endif
随着时间的推移,我已经删除了GUI没有运行的条件,并且它仍然可以正常工作。
答案 2 :(得分:6)
快速解决方法是使用<C-c>
代替,但您可能希望修复<Esc>
上的超时,这是由以<Esc>
开头的映射引起的,这使得Vim等待'timeoutlen'
检查映射是否完整。
这不一定需要是“真实的”映射;许多终端解决方法(例如,使某些键工作)建议设置这样的映射。 (不幸的是,这是一个困难而复杂的问题。)
您可以通过以下方式找到映射:
:verbose map <Esc>
答案 3 :(得分:1)
我没有绑定到&lt; ESC&gt;的映射全局或视觉模式(调用:verbose vmap&lt; ESC&gt;不提供结果)但退出可视模式时仍有明显延迟。即使在没有vimrc的全新安装中,也存在延迟。使用&lt; C-c&gt;确实会立即退出视觉模式。
因为我不想按&lt; C-c&gt;退出任何模式,我目前映射&lt; ESC&gt;至&lt; C-c&gt;在视觉模式。这使用&lt; ESC&gt;退出视觉模式。没有任何延迟。
:vmap <ESC> <C-c>
或者将以下行添加到vimrc
中vnoremap <ESC> <C-c>
如果您确实将全局或可视模式映射绑定到&lt; ESC&gt ;.
,则无法使用此功能。答案 4 :(得分:0)
首先尝试将以下内容添加到.vimrc
set timeoutlen=1000 ttimeoutlen=0
如果这不起作用,请检查您是否对<esc>
有任何键绑定
:imap <esc>
如果您使用tmux,还需要:
set -sg escape-time 0