VIM - Как сопоставить Shift-Enter
Я пытаюсь настроить поведение клавиши Enter
в режиме Normal
в VIM.
Вот мой .vimrc
:
nmap <CR> o<Esc>
nmap <S-CR> i<CR><Esc>
Я пытаюсь сделать Enter просто добавлением новой строки после текущей строки при нажатии. Однако, если нажата комбинация Shift-Enter
, я хочу разбить текущую строку на курсор.
Последнее не работает. Всякий раз, когда я нажимаю Shift-Enter
, он просто добавляет строку, не разбивая ее на курсор.
Ответы
Ответ 1
Из-за того, что ввод на клавиатуре обрабатывается внутренне, это, к сожалению, сегодня вообще не возможно в терминальной версии Vim (<S-CR>
должен работать в GVIM на всех платформах и в консоли Windows Vim). Это известная точка боли и тема различных обсуждений на vim_dev и #vim IRC-канале.
Некоторые люди (прежде всего Пол ЛевНерд Эванс) хотят исправить это (даже для консоли Vim в терминалах, которые поддерживают это), и выпустили различные предложения, ср. http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
Но на сегодняшний день никаких патчей или добровольцев еще не вышли, хотя многие выразили желание иметь это в будущем выпуске Vim 8.
Примечание по отображению <CR>
:
Если вы отображаете <CR>
в нормальном режиме, это будет мешать выбору элементов истории в окне командной строки и при прыжке с ошибкой под курсором в окне быстрого удаления/списка местоположений! (Если вы не добавите следующее:)
:autocmd CmdwinEnter * nnoremap <CR> <CR>
:autocmd BufReadPost quickfix nnoremap <CR> <CR>
Примечание в :nmap
:
Вы должны использовать :noremap
; он делает отображение неустойчивым к переназначению и рекурсии.
Ответ 2
Я также хотел отобразить < S-CR > и обнаружил, что я не мог заставить его работать в режиме CLI, пока не добавил второе отображение, используя Ctrl + V, а затем < Shift + Enter > для отображаемого нажатия клавиши. Тем не менее сопоставление < S-CR > все еще необходимо для того, чтобы GVIm работал, как ожидалось. Это сделает ваш фрагмент .vimrc следующим образом:
nnoremap <CR> o<Esc>
nnoremap <S-CR> i<CR><Esc> " Needed for GVIm
nnoremap ^[0M i<CR><Esc> " Needed for CLI VIm (Note: ^[0M was created with Ctrl+V Shift+Enter, don't type it directly)
Я тестировал это на Ubuntu 12.04. Happy Vimming!
Ответ 3
Ingo Karkat и romainl на 100% правильны. Однако то, что вы просите, является общим, поэтому я хочу дать вам несколько вариантов.
Я лично рекомендую использовать Tim Pope Unimpaired plugin. Он обеспечивает много сопоставлений, но те, которые вы ищете, это [<space>
и ]<space>
, которые создают пустые строки выше и ниже текущей строки соответственно. Unimpaired также обеспечивает приятные сопоставления для перемещения по списку quickfix, списку буфера, переключению параметров и многим другим. Подробнее см. :h unimpaired
.
Если вы не хотите использовать unimpaired plugin, но, как и приведенные ниже сопоставления, некоторые быстрые сопоставления помещаются в ваш файл ~/.vimrc
:
nnoremap <silent> [<space> :<c-u>put!=repeat([''],v:count)<bar>']+1<cr>
nnoremap <silent> ]<space> :<c-u>put =repeat([''],v:count)<bar>'[-1<cr>
Ответ 4
Вы не можете сопоставить <S-CR>
в CLI Vim, как бы вы ни старались, потому что Vim не может отличить <S-CR>
от <CR>
.
Вы должны найти другое сопоставление или палку с помощью GVim/MacVim.
изменить
Некоторые терминальные эмуляторы, такие как iTerm.app или Terminal.app в Mac OS X, позволяют вам настраивать ярлыки для отправки определенных символов в оболочку. Если у вас есть такая возможность, возможно, стоит попробовать, но вы быстро привыкнете к определенному платформе gyzmo, который нельзя портировать так, ну... Я действительно не рекомендую его.
Ответ 5
Мне удалось исправить мой ключ-ключ для терминала Shift + Enter
посылая ключ-код, видимо, ожидает Vim. В зависимости от вашего терминала,
(Добавление Ctrl + Enter в качестве бонуса!)
iTerm2, откройте Настройки → Профили → Клавиши → [+] (Добавить) →
urxvt, добавьте в свой .Xresources
файл:
URxvt.keysym.S-Return: \033[13;2u
URxvt.keysym.C-Return: \033[13;5u
Alacritty, под key_bindings
добавьте следующее к вашему ~/.config/alacritty.yml
:
- { key: Return, mods: Shift, chars: "\x1b[13;2u" }
- { key: Return, mods: Control, chars: "\x1b[13;5u" }