Отображение <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