立即退出视觉模式

时间:2013-03-21 14:20:39

标签: vim

在Vim中,当处于可视模式时,我必须按两次 Esc 退出并关闭选择。按下 Esc 后,我必须等待2秒才能关闭选择。

键入 Esc 时,如何立即退出可视模式?

5 个答案:

答案 0 :(得分:39)

执行以下命令帮助我

set timeoutlen=1000 ttimeoutlen=0

请参阅:http://www.johnhawthorn.com/2012/09/vi-escape-delays/

答案 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