Вим пасть -d '' поведение из коробки?

Может ли vi/vim сделать paste -d ' ' другое, а затем :r !paste -d ' '?

Какова команда native vi/vim, если она есть?

Ответ 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!

Ответ 2

My Плагин UnconditionalPaste содержит (среди прочих) gdp/gdp сопоставления, вставляющие содержимое регистра как минимальную подгонку (т.е. не прямоугольный) блок с запрошенным разделителем, как и paste -d {sep}.

Как в @ib. отличный ответ, вначале потребовалось бы выставить исходный буфер в регистр.

демо

enter image description here