在 Vim 中,在可视模式下,我必须按Esc两次才能退出并关闭选择。按一次后,Esc我必须等待 2 秒才能关闭选择。
Esc按下时我能做什么来立即退出可视模式?
执行以下命令帮助了我:
set timeoutlen=1000 ttimeoutlen=0
见:http ://www.johnhawthorn.com/2012/09/vi-escape-delays/ 。
正如英戈解释的那样。只是想我会发布解决方案: 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 没有运行的情况,据我所知它仍然可以工作。
一个快速的解决方法是<C-c>
改用,但您可能想要修复超时<Esc>
,这是由以 开头的映射引起的<Esc>
,这使 Vim 等待'timeoutlen'
检查映射是否完成。
这不一定需要是“真实”的映射;许多终端解决方法(例如,使某些键工作)建议设置这样的映射。(不幸的是,这是一个困难而复杂的问题。)
您可以通过以下方式找到映射:
:verbose map <Esc>
我没有全局绑定到 <ESC> 或可视模式的映射(调用 :verbose vmap <ESC> 没有结果),但退出可视模式时仍然存在明显延迟。即使在没有 vimrc 的全新安装上,也会出现延迟。使用 <Cc> 确实会立即退出可视模式。
由于我不喜欢按 <Cc> 退出任何模式,因此我目前在可视模式下将 <ESC> 映射到 <Cc>。这使用 <ESC> 退出可视模式,没有任何延迟。
:vmap <ESC> <C-c>
或将以下行放入您的 vimrc
vnoremap <ESC> <C-c>
如果您确实有绑定到 <ESC> 的全局或可视模式映射,这将不起作用。
首先尝试将以下内容添加到已接受的答案.vimrc
set timeoutlen=1000 ttimeoutlen=0
如果这不起作用,请检查您是否有任何键绑定<esc>
:imap <esc>
如果您使用 tmux,您还需要:
set -sg escape-time 0