Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Приятные особенности режима замены

Во многих редакторах (но не в google-docs почему-то) есть режим замены, который обычно включается клавишей Insert. При этом введенный символ замещает тот, что справа от курсора (если он есть). В Вим такой режим тоже имеется, но у него есть любопытные особенности и небесполезный малоизвестный вариант. О них и речь.

Режим можно переключить из режима вставки (и обратно) той же клавишей <Ins>. А также прямо войти в режим замены из нормального режима командой R. Далее всё так, как и везде: текст замещается новым, так что длина строки не увеличивается, пока справа от курсора есть текст. После этого строка просто растет вправо, как и в режиме вставки.

Однако: при нажатии клавиши ввода символ справа от курсора не удаляется! Просто вставляется символ новой строки.

Если в тексте стоит табуляция, она будет замещена новым символом, но строка визуально сдвинется. Это важно при редактировании текстовых данных, если столбцы разделены табами. Подробнее об этом далее. Обратное тоже верно: табуляция, при заданной expandtab, заменит один символ несколькими пробелами.

Приятное отличие вимовского режима замены от классического в том, что замещаемый текст не удаляется насовсем. Дело не в том, что можно сделать отмену, это-то само собой. Но если вы заменили некий текст другим, а потом удалили его посредством <BS>, <C-W> или <C-U> (см. предыдущую заметку про режим вставки), то будет восстановлен старый текст. Пример:

I love you, Jane!

Курсор на букве J. Вы входите в режим замены и печатаете "Maria!". Получаете

I love you, Maria!

Теперь, не выходя из режима замены, вы передумали и нажимаете <BS> шесть раз.

Восстанавливается, посимвольно, предыдущий текст! Если вы ввели символ табуляции и он раскрылся в серию пробелов, то отменяться будут пробелы по одному, а после последнего вернется бывший на этом месте символ. Логично.

Всё, что сказано про спецклавиши в режиме вставки, верно и в режиме замены.

Режим виртуальной замены

Есть такой вариант. Включается из нормального режима посредством команды gR. В целом похож на режим замены, но:

символы правее курсора не смещаются, и строки ниже (и выше) тоже. Это касается, прежде всего, табуляции, потому что если ее заменить другим символом, строка станет короче. А здесь — не станет.

Это касается клавиши ввода: теперь остаток строки будет уничтожен, а курсор перейдет на начало следующей строки. Строки ниже и выше не сдвинутся с места. Новая строка не появится, если вы не в самом конце файла.

Команды для управления отступами, <C-T> и <C-D>, работают соответствующе. Первая, создавая отступ, удаляет символы в начале строки, а вторая, отменяя отступ, их возвращает.

Включен этот режим. Желтым выделены табы (последнее, что искал Вим). Я редактирую первый столбец поверх, залезая на пространство между столбцами. Табуляция остается собой, пока не будет съедено всё пространство. В отличие от обычной замены, в которой первый же символ, вышедший за пределы столбца, заменит табуляцию, а потом начнет страдать второй столбец данных.
Включен этот режим. Желтым выделены табы (последнее, что искал Вим). Я редактирую первый столбец поверх, залезая на пространство между столбцами. Табуляция остается собой, пока не будет съедено всё пространство. В отличие от обычной замены, в которой первый же символ, вышедший за пределы столбца, заменит табуляцию, а потом начнет страдать второй столбец данных.

Этот режим полезен при редактировании текстовых данных, особенно разделенных табуляциями. Особенно, если клавиша <Tab> переопределена. Можно редактировать столбец, не трогая не столбцы справа, ни слева, и ни данные ниже, ни выше. Главное, не влезть физически в следующий столбец!

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу