36

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

Esc按下时我能做什么来立即退出可视模式?

4

5 回答 5

51

执行以下命令帮助了我:

set timeoutlen=1000 ttimeoutlen=0

见:http ://www.johnhawthorn.com/2012/09/vi-escape-delays/ 。

于 2013-03-21T14:51:38.680 回答
11

正如英戈解释的那样。只是想我会发布解决方案: 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 没有运行的情况,据我所知它仍然可以工作。

于 2013-03-21T14:49:45.080 回答
6

一个快速的解决方法是<C-c>改用,但您可能想要修复超时<Esc>,这是由以 开头的映射引起的<Esc>,这使 Vim 等待'timeoutlen'检查映射是否完成。

这不一定需要是“真实”的映射;许多终端解决方法(例如,使某些键工作)建议设置这样的映射。(不幸的是,这是一个困难而复杂的问题。)

您可以通过以下方式找到映射:

:verbose map <Esc>
于 2013-03-21T14:34:50.327 回答
1

我没有全局绑定到 <ESC> 或可视模式的映射(调用 :verbose vmap <ESC> 没有结果),但退出可视模式时仍然存在明显延迟。即使在没有 vimrc 的全新安装上,也会出现延迟。使用 <Cc> 确实会立即退出可视模式。

由于我不喜欢按 <Cc> 退出任何模式,因此我目前在可视模式下将 <ESC> 映射到 <Cc>。这使用 <ESC> 退出可视模式,没有任何延迟。

:vmap <ESC> <C-c>

或将以下行放入您的 vimrc

vnoremap <ESC> <C-c>

如果您确实有绑定到 <ESC> 的全局或可视模式映射,这将不起作用。

于 2015-08-17T12:31:29.013 回答
0

首先尝试将以下内容添加到已接受的答案.vimrc

set timeoutlen=1000 ttimeoutlen=0

如果这不起作用,请检查您是否有任何键绑定<esc>

:imap <esc>

如果您使用 tmux,您还需要:

set -sg escape-time 0
于 2020-06-23T12:29:09.400 回答