Ответ 1
Рассмотрим несколько другую, но тесно связанную проблему: добавляя один ряд строк в другой диапазон, непосредственно предшествующий ему. После его решения мы вернемся к исходной проблеме и покажем, как она может быть сведена к предлагаемому.
Без ограничения общности предположим, что первый блок линии (тот, который добавляет второй), начинается в первой строке буфера, и что курсор расположен на последней строке этого первый блок. В этом случае линии можно объединить, используя следующие короткая и эффективная команда 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!