Может ли vi/vim сделать paste -d ' '
другое, а затем :r !paste -d ' '
?
Какова команда native vi/vim, если она есть?
Может ли vi/vim сделать paste -d ' '
другое, а затем :r !paste -d ' '
?
Какова команда native vi/vim, если она есть?
Рассмотрим несколько другую, но тесно связанную проблему: добавляя один ряд строк в другой диапазон, непосредственно предшествующий ему. После его решения мы вернемся к исходной проблеме и покажем, как она может быть сведена к предлагаемому.
Без ограничения общности предположим, что первый блок линии (тот, который добавляет второй), начинается в первой строке буфера, и что курсор расположен на последней строке этого первый блок. В этом случае линии можно объединить, используя следующие короткая и эффективная команда 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!
My Плагин UnconditionalPaste содержит (среди прочих) gdp
/gdp
сопоставления, вставляющие содержимое регистра как минимальную подгонку (т.е. не прямоугольный) блок с запрошенным разделителем, как и paste -d {sep}
.
Как в @ib. отличный ответ, вначале потребовалось бы выставить исходный буфер в регистр.