2013-03-21 4 views
28

В Vim, когда в визуальном режиме, я должен нажать Esc дважды, чтобы выйти из него и отключить выбор. После одного нажатия Esc Мне нужно подождать 2 секунды, чтобы выбор отключился.Выход из визуального режима без задержки

Что можно сделать, чтобы выйти из визуального режима сразу при вводе Esc?

+2

у вас есть сопоставление с клавишей ESC? – Kent

ответ

37

Выполнение следующей команды помогли мне

set timeoutlen=1000 ttimeoutlen=0 

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

+10

Интересно, почему кто-то отменил этот ответ, так как он отлично работает. Я нашел полезной настройку для tmux в ссылке: 'set -sg escape-time 0' – mMontu

+0

@mMontu Omg спасибо, я злился, пытаясь понять, почему настройка не использовалась в vim, я понятия не имел У tmux была своя отдельная настройка! –

+0

для меня это, казалось, проявилось при использовании tmux. Комментарий mMontu указал мне на ссылку, в которой работало чудеса – Paul

5

Быстрый обходной путь использует <C-c> вместо этого, но вы, вероятно, хотите, чтобы исправить таймаут <Esc>, которое вызывается отображением, которое начинается с <Esc>, что делает Vim ждать 'timeoutlen', чтобы проверить, является ли отображение завершено.

Это необязательно должно быть «реальным» отображением; многие обходные пути для терминала (например, для работы определенных клавиш) советуют настроить такое сопоставление. (К сожалению, это трудный и сложный вопрос.)

Вы можете найти отображение с помощью:

:verbose map <Esc> 
+0

при выполнении '' нет задержек. Но я хочу использовать «ESC». Я получаю 'No mapping found' – Ozkan

+1

Hm, это также может быть вызвано одним из параметров': set t_... ', но я не знаю, как это устранить. –

8

Как пояснил Инго. Просто подумал, что я выложу решение: https://github.com/Greduan/dotfiles/blob/47f92e4db29d4ead778d877a85082b271de130ed/vim/vimrc.vim#L332-L346

Работы очень хорошо. Для меня это немного запутывает, поэтому я не могу объяснить, но код очень хорошо объясняет.

Пункт он работает, он просто делает <Esc> работает сразу же, когда на терминале. Я считаю, что если у вас есть сопоставления, установленные на <Esc>, это даст вам время, чтобы сделать это. Однако я не уверен.

EDIT

Училась немного, и теперь я могу это объяснить. В принципе, если вы не используете графический интерфейс (например, MacVim), тогда, когда вы входите в режим вставки, ttimeoutlen будет установлен в 0. Это означает, что как только вы нажмете <Esc>, это сработает. Однако, как только вы в нормальном режиме, он установит ttimeoutlen на номер, который вы предпочитаете, позволяя делать сопоставления с <Esc>.

Идеальное решение Я думаю, поскольку, если у вас есть отображения в режиме вставки, он будет использовать элемент управления или что-то в этом роде.

EDIT 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 

Со временем я удалил условие, что графический интерфейс не работает, и он все еще работает, насколько я могу судить.

+0

какая разница между 2000 мс от второй линии и 1000 мс? Благодаря! – etal

+0

@etal не уверен честно. Я сделал это так давно. : P Они такие же, чтобы их можно было установить одинаково. Чтение ': h timeout',': h timeoutlen' и ': h ttimeoutlen' должно помочь вам разобраться в этом. Я уверен, что причиной является просто обходное решение для причуд, созданное разницей между тем, как это делает GUI-версия Vim и как работает эта версия Vim для терминала. Надеюсь, это поможет. :) – greduan

1

У меня нет отображения, связанного с <ESC> глобально или для Визуальный режим (вызов: многословный VMAP <ESC> не дает никаких результатов), но при выходе из визуального режима все еще существует значительная задержка.Даже при свежих установках без vimrc присутствует задержка. Использование < C-c > действительно выходит из визуального режима без задержки.

Поскольку я не люблю нажав < C-C > для выхода из любого режима, я в данный момент на карте <ESC> в < C-с > в визуальном режиме. Это завершает визуальный режим, используя <ESC> без каких-либо задержек.

:vmap <ESC> <C-c> 

Или добавьте следующую строку в ваш vimrc

vnoremap <ESC> <C-c> 

Это не будет работать, если у вас есть глобальные или визуальные отображения режима, связанные с <ESC>.

Смежные вопросы