Exit visual mode without delay

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-29 02:43:07

问题


In Vim, when in visual mode, I have to press Esc twice to exit it and turn off the selection. After one press of Esc I have to wait 2 seconds for the selection to turn off.

What can I do to exit visual mode immediately when typing Esc?


回答1:


Executing following command helped me:

set timeoutlen=1000 ttimeoutlen=0

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




回答2:


As Ingo explained. Just thought I would post the solution: https://github.com/Greduan/dotfiles/blob/47f92e4db29d4ead778d877a85082b271de130ed/vim/vimrc.vim#L332-L346

Works pretty well. It's a little bit confusing for me as well, so I can't really explain, but the code explains itself pretty well.

The point is it works, it simply makes <Esc> work immediately even when on Terminal. I believe if you do have mappings set to <Esc> it'll give you time to do those as well. However I'm not sure.

EDIT

Studied a bit and I can now explain it. Basically, if you're not using a GUI (like MacVim) then when you enter insert mode the ttimeoutlen will be set to 0. Meaning that as soon as you click <Esc> that'll work. However once you're in normal mode then it'll set the ttimeoutlen to the number you prefer, letting you do mappings with <Esc>.

Perfect solution I think, since if you have mappings in insert mode it'll be using control or something like that.

EDIT 2

Here's the code:

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

With time I've removed the condition that the GUI isn't running and it still works as far as I can tell.




回答3:


A quick workaround is using <C-c> instead, but you probably want to fix the timeout on <Esc>, which is caused by a mapping that starts with <Esc>, which makes Vim wait for 'timeoutlen' to check whether the mapping is complete.

This does not necessarily need to be a "real" mapping; many terminal workarounds (e.g. to make certain keys work) advise to set up such a mapping. (Unfortunately, this is a difficult and complex issue.)

You can find the mapping via:

:verbose map <Esc>



回答4:


I have no mapping bound to <ESC> globally or for Visual mode (calling :verbose vmap <ESC> gives no results) but there is still a significant delay when exiting Visual mode. Even on fresh installs with no vimrc the delay is present. Using <C-c> does exit visual mode without delay.

Since I don't like pressing <C-c> to exit any mode, I currently map <ESC> to <C-c> in visual mode. This exits visual mode using <ESC> without any delay.

:vmap <ESC> <C-c>

Or put the following line in your vimrc

vnoremap <ESC> <C-c>

This will not work if you do have global or visual mode mappings bound to <ESC>.



来源:https://stackoverflow.com/questions/15550100/exit-visual-mode-without-delay

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!