Выход из режима вставки блока с помощью Ctrl-C

8

В vim, если вы находитесь в режиме вставки блока ( Ctrl-V, Shift-I) и выходите с помощью Ctrl-C(вместо Esc), он отменяет редактирование блока (и редактирует только первую строку).

Почему это? Практически во всех других контекстах Ctrl-Cи Escявляются синонимами. (И в идеале есть способ это исправить - теперь я привык к этому, Ctrl-Cи было бы стыдно, если бы мне пришлось переучиваться…)

Софи Альперт
источник

Ответы:

9

Ctrl-cи Escне гарантируется быть синонимами, и часто отличаются. Например, в режиме « Вставка » Escбудут запускаться сокращения и переходить в обычный режим, тогда как Ctrl-cне будут запускаться сокращения или InsertLeaveавтокоманда и переходить прямо в обычный режим. Другой пример в старом viрежиме командной строки, Escбудет фактически выполнять команду, как если бы вы нажали Enter. Vim намеренно изменил это, потому что такое поведение было сочтено неинтуитивным и удивительным, но вы все равно можете включить его, добавив xв 'cpoptions'.

Что касается блочных визуальных операторов, blockwise-operatorsтег справки имеет следующую документацию:

Visual-block Insert                     *v_b_I*
With a blockwise selection, I{string}<ESC> will insert {string} at the start
of block on every line of the block, provided that the line extends into the
block.  Thus lines that are short will remain unmodified.  TABs are split to
retain visual columns.

Обратите внимание, что только Escупоминается, а не Ctrl-c.

Так что нет Ctrl-cи Escне эквивалентны. Никогда не стыдно лишать себя заблуждения. Как только вы поняли это, вы можете решить, что делать дальше. Сразу очевидные варианты - изучить различия и использовать правильный ключ или решить, что вам не нужен функционал одного из ключей, и переназначить его для соответствия другому.

jw013
источник
4
Попался. Пока vnoremap <C-c> <Esc>я буду помнить то, что вы сказали.
Софи Альперт,
@BenAlpert: вам на самом деле нужно не отображать карту inore с теми же значениями, чтобы полностью переключиться на ctrl-c как Esc. Я использую его вот уже много лет, и он отлично работает для меня. Жаль, что другие варианты vi, такие как vile или nvi, не разрешают этот обходной путь, поэтому я упускаю возможности abbr.
Алекс
0

Попробуйте, :map ^C escгде "^ C" вводится через CTRL+, а vзатем CTRL+ c.

donothingsuccessfully
источник
Можете ли вы объяснить, почему это необходимо? Какие еще могут быть побочные эффекты?
Софи Алперт
Они выполняют несколько разные функции. CTRL + C условно означает «отменить это действие» (в контексте, подобном Unix). Отмена действия в контексте vim означает «остановите то, что происходит, и вернитесь в обычный режим». Escape в vim означает: «Я закончил, вернись в нормальный режим».
Успехов
Что касается побочных эффектов, я их не заметил. CTRL-C после :!catвсе еще, кажется, имеет желаемый эффект после карты. Если у вас возникли проблемы, вы можете попробовать, например, stty intr \^kв командной строке изменить символ прерывания терминала на CTRL-k.
Успехов