Я много лет пользовался определенным редактором и привык выбирать слова с помощью Alt+Return. Я не могу потерять эту привычку и все еще пытаюсь делать это в Vim слишком часто, всегда безуспешно.

Итак, я пытаюсь это:

noremap     <M-Return>  viw
noremap     <C-Return>  viw

Видите ли, я пытаюсь оба, Alt+Return и Ctrl+Return. Но ни один не работает.

Это работает:

noremap     <C-M>   viw

Я нажимаю Ctrl+m и слово выделяется. Но это имеет странный побочный эффект: Return/Enter один также выбирает слова! И я не хочу этого.

Так что это двойной вопрос:

1) Как заставить Alt+Enter выбрать текущее слово (под курсором)?

2) Почему Return/Enter действует как Ctrl+m?

3 ответа3

4

Из-за способа обработки ввода с клавиатуры, к сожалению, сегодня это вообще невозможно, даже в GVIM. Некоторые сочетания клавиш, такие как Ctrl + не алфавитный, не могут быть сопоставлены, и Ctrl + буква против Ctrl + Shift + буква не может быть различена. (Если ваш терминал не отправляет для него отдельный код termcap , чего большинство не делает.) В режиме вставки или командной строки попробуйте ввести комбинацию клавиш. Если ничего не происходит / вставлено, вы не можете использовать эту комбинацию клавиш. Это также относится к <Tab> / <C-I> , <CR> / <C-M> / <Esc> / <C-[> и т.д. (Единственное исключение - <BS> / <C-H> .) Это известная проблема и предмет различных дискуссий на vim_dev и IRC-канале #vim.

Некоторые люди (прежде всего Пол ЛеоНерд Эванс) хотят это исправить (даже для консоли Vim в терминалах, которые поддерживают это), и выдвинули различные предложения, ср. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

Но на сегодняшний день никаких патчей или добровольцев еще не появилось, хотя многие выразили желание иметь это в будущем выпуске Vim 8.

4

Решение будет зависеть от вашего терминала и от того, как он настроен. Терминалы Unix обычно отправляют метасимвол или последовательность, когда вы удерживаете Alt и нажимаете другую клавишу. Существует два традиционных способа отправки метасимволов в терминальные программы:

  1. Возьмите значение ASCII другой нажатой клавиши (то есть той, которая не является Alt) и OR со значением 128 (установка бита 7 в высоту). Это не рекомендуется в наши дни, потому что полученный 8-битный код символа не совместим с UTF-8 или даже с 8-битными кодировками, такими как Latin-1.

  2. Отправьте escape-символ ASCII 27, а затем код ASCII для другого ключа. Это хорошо работает с различными кодировками, но может усложнить обработку случаев, когда вы действительно намеревались отправить явный escape-символ, например, когда вы нажимаете Esc в Vim.

Если ваш терминал настроен на использование # 2, у вас может возникнуть желание сделать noremap <Esc><CR> viw . Тем не менее, это заставит Vim сделать паузу всякий раз, когда он получает побег. Чтобы избежать этого, вы можете set код клавиши <A-CR> и использовать его на map ; это делает так, чтобы Vim мог рассматривать последовательность как отличающуюся от последовательности escape+ символа (в частности, у последовательности может быть тайм-аут, который намного короче, чем тот, который используется другими отображениями; так как терминалы отправляют escape-символ и следующий символ почти одновременно это может предотвратить случайный запуск кода клавиши, когда вы этого не пытаетесь).

Команда set сама интерпретирует строки как <Esc> буквально (т.е. не конвертирует их в ASCII 27), поэтому вы должны обернуть их в exec:

exec "set <A-CR>=\<Esc>\<CR>"

После этого вы можете наконец сделать отображение:

noremap <A-CR> viw

Возможно, вы также захотите установить очень короткий ttimeoutlen чтобы случайно не запустить это новое отображение с помощью Esc Return, например

:set timeout timeoutlen=3000 ttimeoutlen=100

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

Рекомендации:

  1. :h :set-termcap
  2. :h :map-alt-keys
  3. :h 'ttimeout'
2

Откройте терминал или переведите себя в режим вставки в vim, а затем нажмите <c-v>Return и вы поймете, почему ваша привязка <C-M> имеет такой эффект.

Это также должно объяснить вам, почему вы не можете связать <C-Return> или <M-Return> в консоли vim (вы можете сделать это в gvim, но я не уверен).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .