Vim: Как скопировать Ctrl-M, не влияя на нажатие клавиши Return?

Я хочу нанести Ctrl - M на Ctrl - N в режиме вставки. Если я просто делаю imap <C-M> <C-N>, тогда Ctrl - M начинает вести себя точно так же, как Ctrl - N, но затем нажатие Enter делает то же самое. Я хочу нажимать Return для продолжения вставки новых строк и в то же время сделать Ctrl - M вставить следующее совпадение завершения по ключевому слову так же, как Ctrl - N. Возможно ли это?

EDIT: Мне удалось изменить исходный код Vim, чтобы безоговорочно относиться к Ctrl - M как Ctrl - N, не затрагивая Return. При этом я также понял, что на самом деле нет способа сделать это без изменения исходного кода, поскольку различие между тем, что на самом деле было нажато - Enter или Ctrl - M, похоже, слишком рано исчезает -прекрасная обработка. Это происходит в платформенно-зависимых модулях пользовательского интерфейса, а переносимая часть кода в обработке нажатия клавиш уже не имеет понятия, было ли нажато Ctrl - M или Return, что привело к key code 13.

Мои изменения были в модулях графического интерфейса для FreeBSD (GTK) и Windows, так как это платформы, в которых я чаще всего использую gvim.

P.S. Если кто-то хочет достичь того же, пожалуйста, напишите мне.

P.P.S. Всем, кто дал ответы на этот вопрос: большое спасибо! Ваши комментарии очень помогли мне.

Ответ 1

Если вы используете Windows, вы, вероятно, можете использовать Autohotkey для перепрограммирования Ctrl-M в режиме вставки, если активным окном является vim.

ahk script, вероятно, будет выглядеть примерно так:

 #IfWinActive, Write: ahk_class GVIM
 ^M::^N

В качестве альтернативы вы можете подумать о том, чтобы работать с навыками ввода текста (я сомневаюсь, что вы хотите услышать это решение, но я все еще считаю это правильным предложением), чтобы избежать путаницы Ctrl-M и Ctrl-N.

Если вы используете какой-то вкус Linux, я не уверен, какие инструменты могут быть эквивалентны autohotkey.

Другой альтернативой является отображение совершенно другого ключа, позволяющего выполнять автозаполнение вместо использования ctrl-n, например Ctrl-K: :inoremap <c-k> <c-n>

Ответ 2

:help key-notation ясно указывает, что CTRL-M эквивалентен Enter. Это связано с тем, что возврат каретки является символом ASCII no. 13, а М - 13-я буква алфавита.

Ответ 3

Следующее будет рассматривать CTRL-M (или Enter, как указано Benoit) как CTRL-N, когда всплывающее меню отображается и возвращается к операции по умолчанию, когда всплывающее меню не отображается.

:inoremap <C-M> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>C-M>"<CR>

Это требует, чтобы вы вызывали всплывающее меню с помощью CTRL-N или CTRL-P перед использованием CTRL-M как CTRL-N.

Ответ 4

Один из способов сделать это (в зависимости от вашего терминала) - переназначить (в вашем терминале) клавишу return на C-J. C-J, похоже, действует как возвращение почти в каждом терминальном приложении.