Подтвердить что ты не робот

Выход из визуального режима без задержки

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

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

4b9b3361

Ответ 2

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

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

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

ИЗМЕНИТЬ

Немного изучил, и теперь я могу объяснить это. В принципе, если вы не используете графический интерфейс (например, 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 не работает, и он все еще работает, насколько я могу судить.

Ответ 3

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

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

Вы можете найти отображение через:

:verbose map <Esc>

Ответ 4

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

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

:vmap <ESC> <C-c>

Или введите следующую строку в свой vimrc

vnoremap <ESC> <C-c>

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