Давайте рассмотрим несколько другую, но тесно связанную проблему: добавление одного диапазона строк к другому, непосредственно предшествующему ему.Решив ее, мы вернемся к исходной задаче и покажем, как ее можно сократить до предложенной.
Не ограничивая общности, мы предполагаем, что первый блок строк (тот, к которому добавляется второйto) начинается с первой строки буфера, и курсор находится на последней строке этого первого блока.В этом случае строки могут быть объединены с помощью следующей короткой и эффективной команды Ex:
:1,g/^/''+m.|-j!
Эта команда :global
запускает диапазон строк от первой до текущей, последовательно выполняя две команды Ex.команды: ''+m.
и -j!
.Первая, команда :move
, удаляет строку рядом с той, где был расположен курсор, и вставляет ее чуть ниже той, которая в данный момент обрабатывается командой :global
.Последняя, команда :join
, добавляет только что перемещенную строку к вышеупомянутой (без добавления или удаления пробелов между ними из-за модификатора !
).
При построении этих команд используются два преимущества.неявные факты.Во-первых, перед тем, как команда, указанная в :global
, будет выполнена в еще одной строке, курсор будет помещен в первый столбец этой строки.Это означает, что адрес, обозначенный .
, соответствует последней строке, в которой в данный момент выполняется команда.Во-вторых, позиция курсора перед отправкой команды :global
на выполнение добавляется в список переходов.Следовательно, это местоположение можно адресовать в диапазонах через псевдометку '
(см. :help :range
).
Если необходимо поместить разделитель между соединенными строками, можно добавить команду подстановки, вставивперед выполнением :join
:
:1,g/^/''+m.|s/^/\t/|-j!
Существует опция поведения разделения предложений Vim по умолчанию, которая используется при запуске команды :join
без модификатора !
,
:1,g/^/''+m.|-j
Подробнее об этом поведении разделения пространства см. :help J
, :help
:join
, и особенно параграф, который можно найти по :helpg These
commands, except "gJ"
.
Этот метод легко применим к проблеме ввопрос, поскольку исходная ситуация может быть сужена до той, которую мы рассмотрели выше.Для этого перейдите в буфер, содержащий строки для добавления и копирования их,
:%y
Затем переключитесь на целевой буфер, содержащий текст для добавления, и вставьте скопированные строки под текущимсодержимое буфера,
:$pu|'[-
Последняя команда объединяет два действия:
- Вставить содержимое безымянного регистра ниже последней строки, перемещая курсор на последнюю строкувставленный текст.
- Переместите курсор на строку, которая была последней перед вставкой.
При этом одну из предложенных ранее :global
команд можно использовать немедленно.Можно выполнить вставку и преобразование за один проход:
:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!