Vim вставляет -d '' поведение из коробки? - PullRequest
13 голосов
/ 12 марта 2012

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

Как называется собственная команда vi / vim, если таковая имеется?

Ответы [ 2 ]

18 голосов
/ 12 марта 2012

Давайте рассмотрим несколько другую, но тесно связанную проблему: добавление одного диапазона строк к другому, непосредственно предшествующему ему.Решив ее, мы вернемся к исходной задаче и покажем, как ее можно сократить до предложенной.

Не ограничивая общности, мы предполагаем, что первый блок строк (тот, к которому добавляется второй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|'[-

Последняя команда объединяет два действия:

  1. Вставить содержимое безымянного регистра ниже последней строки, перемещая курсор на последнюю строкувставленный текст.
  2. Переместите курсор на строку, которая была последней перед вставкой.

При этом одну из предложенных ранее :global команд можно использовать немедленно.Можно выполнить вставку и преобразование за один проход:

:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
0 голосов
/ 24 марта 2014

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

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

демо

enter image description here

...