Отображение <esc> в vimrc вызывает странное поведение стрелки

Я счастливый пользователь VIM, хотя, признаюсь, я довольно далек от свободного общения. Я нашел этот хороший пост: Vim очистит последний поиск, выделив, и я подумал, что стал бы лучшим человеком, если бы я не должен был удалять случайную последовательность символов каждый раз, когда я делал поиск. Теперь я также использую конфигурацию vimrc:

http://amix.dk/vim/vimrc.html

и проблема заключается в том, что когда я добавляю к ней строку nnoremap <esc> :noh<return><esc> (это не похоже на то, где я ее помещаю), я получаю неудобное поведение, когда я использую стрелки в командном режиме, а именно буквы из От A до D появляются в новой строке, и я переключаюсь в режим вставки.

Должен быть какой-то конфликт, но для жизни я не могу понять, где он находится.

РЕДАКТИРОВАТЬ: Как следует из ответов, часть Ultimate vimrc не имеет значения, упомянутая команда nnoremap вызовет изменение поведения стрелок, даже если это единственная запись vimrc. Изменение названия на более информативный.

PS. Я знаю, что я не должен использовать стрелы, надеюсь, что однажды приеду.

Ответ 1

Отображение

nnoremap <esc> :noh<return><esc>

будет конфликтовать с так называемыми "серыми ключами", и я считаю, что он должен использоваться либо в GVim, либо в терминале Vim кем-то, кто не использует специальные клавиши, такие как стрелки.

Из того, что я знаю (и угадываю), как Vim обрабатывает ключи, я бы сказал, что с этим невозможно что-либо сделать. Чтобы Vim распознал специальный ключ, все его компоненты должны идти в ряд, поэтому, когда вы нажимаете Arrow Left, Vim получает следующую последовательность кодов:

<esc> [ D

Но после того, как ваше отображение Arrow Left станет следующим:

: n o h l <cr> <esc>

[ D

Vim видит две отдельные последовательности и рассматривает <esc> как одно нажатие клавиши Escape, поэтому следующие два кода ключа Left Arrow теряют свое особое значение.

Поэтому я предлагаю вам сопоставить :noh с какой-либо другой последовательностью клавиш (например, с одним запуском с <leader>, см. :help mapleader; я не рекомендую вам использовать F-ключи, используя их так же плохо, как использование клавиш со стрелками).

Ответ 2

Это решение сохраняет отображение ESC на :nohlsearch.

Комментарий Этот ответ, объясняющий , почему это происходит, говорит нам, что основной причиной является поведение vim для TermResponse. Это можно компенсировать путем переноса отображения в автокоманду для события TermResponse.

Это гарантирует, что привязка не будет выполняться до тех пор, пока после не будет установлен термин response, что предотвратит также ESC от отправки строки, например ]>1;3201;0c, на vim.

Измените свою строку в vimrc на:

augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
augroup END

Команды augroup не являются строго необходимыми, но они предотвращают множественные сопоставления при перезагрузке vimrc без выхода из vim.

РЕДАКТИРОВАТЬ: Если вы также используете графический виртуальный движок, такой как Gvim или Macvim, событие TermResponse не срабатывает. Предполагая, что вы используете один vimrc, вам понадобится дополнительный код, например

if has('gui_running')
  nnoremap <silent> <esc> :nohlsearch<return><esc>
else
  " code from above
  augroup no_highlight
    autocmd TermResponse * nnoremap <esc> :noh<return><esc>
  augroup END

end

Ответ 3

Причина была хорошо объяснена, но решение не было упомянуто. Однако есть прямой.

Если вы прямо сообщите Vim, что есть последовательности клавиш, начиная с <esc>[

:nnoremap <silent><esc> :noh<CR>
:nnoremap <esc>[ <esc>[

чем при нажатии кнопки <esc> Vim будет ждать второй (или другое время, см. :h 'timeoutlen') или для следующей клавиши (например, второй <esc>), а затем замените его на :noh<CR>.

Ответ 4

Проблема заключается в том, что при нажатии клавиши со стрелкой появляется нечто вроде <Esc>OA. Часть Vim, которая поддерживает терминал, по-видимому, использует тот же механизм сопоставления для выполнения задания, когда вы используете: while nmap <Esc>OA ничего не скажет, call feedkeys("\eOA") переместит одну строку вверх, а call feedkeys("\eOA", 'n') добавит букву A за пределы текущей строки. Если ваше отображение не используется, вы запрещаете vim использовать <Esc> как часть ключа. Проблема в том, что здесь вам нужно переназначить сопоставление, но может иметь отображаемое отображение без его рекурсивности, только если оно начинается с {lhs}, но <Esc>:noh<CR>OA не будет работать. Я думал, что следующий код будет (он использует <expr> и функцию с побочным эффектом, чтобы сделать <Esc> первым символом фактического {rhs} и все еще запускать :noh), но на самом деле это не так:

function s:NoHlSearch()
    nohlsearch
    return "\e"
endfunction
nmap <expr> <Esc> <SID>NoHlSearch()

. У меня нет другой идеи, как решить проблему наличия нерекурсивного перепрограммируемого отображения, которое включает {lhs}, но не в начале.

Ответ 5

Мне повезло с этим

if $TERM =~ 'xterm'
  set noek
endif
nnoremap <silent> <esc> <esc>:noh<cr>

Недостатком является то, что функциональные клавиши не могут использоваться в режиме вставки.

:h ek