如何在Vim中不延迟地退出可视模式?

如何在Vim中不延迟地退出可视模式?,vim,Vim,在Vim中,当处于视觉模式时,我必须按Esc键两次才能退出并关闭选择。按下Esc键一次后,我必须等待2秒钟,以关闭选择 按下Esc时如何立即退出可视模式?一个快速解决方法是使用,但您可能希望修复上的超时,这是由以开头的映射引起的,该映射使Vim等待'timeoutlen'检查映射是否完成 这不一定是一个“真实”的映射;许多终端解决方案(例如,使某些键工作)建议设置这样的映射。(不幸的是,这是一个困难而复杂的问题。) 您可以通过以下方式找到映射: :verbose map <Esc>

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


按下Esc时如何立即退出可视模式?

一个快速解决方法是使用
,但您可能希望修复
上的超时,这是由以
开头的映射引起的,该映射使Vim等待
'timeoutlen'
检查映射是否完成

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

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

:verbose map <Esc>
:详细映射

如Ingo所述。我只是想发布解决方案:

效果很好。这对我来说也有点困惑,所以我不能真正解释,但代码本身解释得很好

关键是它可以工作,它只是使
即使在终端上也能立即工作。我相信,如果将映射设置为
,也会给您时间来完成这些操作。但是我不确定

编辑

我研究了一下,现在可以解释了。基本上,如果您不使用GUI(如MacVim),则当您进入插入模式时,
ttimeoutlen
将设置为0。这意味着只要你点击
,就可以了。但是,一旦进入正常模式,它会将
ttimeoutlen
设置为您喜欢的数字,允许您使用
进行映射

我认为这是一个完美的解决方案,因为如果在插入模式下有映射,它将使用控件或类似的东西

编辑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不运行的情况,并且它仍然可以正常工作。

执行以下命令对我有所帮助:

set timeoutlen=1000 ttimeoutlen=0

请参阅:。

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

因为我不喜欢按退出任何模式,所以我当前在视觉模式下映射到。这将立即退出使用的可视模式

:vmap <ESC> <C-c>
:vmap
或者在vimrc中放入以下行

vnoremap <ESC> <C-c>
vnoremap

如果已将全局或可视模式映射绑定到,则此操作将不起作用。

首先尝试将以下内容添加到
。vimrc

set timeoutlen=1000 ttimeoutlen=0
如果不起作用,请检查您是否有到


您是否使用ESC键进行映射?执行
时确实没有延迟。但是我想使用
ESC
。我发现
未找到映射
Hm,这也可能是由
:set t…
设置之一引起的,但我不知道如何解决这个问题。我想知道为什么有人否决了这个答案,因为它工作得很好。我在参考资料中发现tmux的设置很有用:
set-sg escape time 0
@mMontu Omg谢谢你,我想弄清楚为什么在vim中没有使用该设置,我不知道tmux有自己的单独设置!对我来说,这似乎是在使用tmux时表现出来的。Ammontu的评论将我指向了链接,它工作得非常好。当您有任何以
开头的映射时,这不起作用,您仍然会有延迟。在我的例子中,我将
Alt
j
k
映射到移动行,并将它们转换为
j
k
。真的不明显。在这种情况下有帮助。这也消除了重复插入时的延迟(例如,
2itext
)!第二条线路的2000ms和1000ms之间有什么区别?谢谢@我真的不确定。我很久以前就这样做了P它们是相同的选项,所以它们可能被设置为相同的。不过,阅读
:h timeout
:h timeoutlen
:h ttimeoutlen
可以帮助您解决这个问题。我很确定原因仅仅是解决了GUI版本的Vim如何处理这个问题和终端版本的Vim如何处理这个问题之间的差异所产生的问题。希望有帮助。:)
:imap <esc>
set -sg escape-time 0