Как присоединиться к каждой второй строке в Vim?

28

Я хотел бы объединить много (~ 1000) строк, но только каждую нечетную со следующей. От руки я мог сделать

Jj

500 раз и сделали это. Тем не менее, как я могу выполнить эти два оператора 500 раз в одной команде? Typing

500Jj

присоединится к следующим 500 линиям и затем двинется вниз на одну строку.

Пример:

Я имею:

a
b
c
d
e
f
g
h

Я хочу:

a b
c d
e f
g h

Редактировать: я пробовал картирование:

:map X Jj
500X

но, видимо, мне следует снова прочитать документы по картографированию. Не работает

Boldewyn
источник

Ответы:

30

я бы сделал это:

  1. начать запись макроса 'q': qqJjq

  2. повторить макрос 'q' 500 раз: 500@q

(на самом деле это не макрос с именем 'q', это именованный регистр с именем 'q'. Вместо того, чтобы интерактивно заполнять этот регистр, как в 1., вы также можете сделать, :let @q = "Jj"а затем сделать 2.)

Акира
источник
Круто, спасибо, что вспомнили мне макросы!
Болдевин
:% normal J был очень быстрым и легким (см. 2-е топ-решение ниже) ... по сравнению с этим макро-решением, выполняющим его на более чем 50 000 строк
ihightower
@ihightower, поэтому я тоже проголосовал за этот ответ. 6 лет назад :)
Акира
@akira твой макрос только что спас мой день, так как мне нужно было сегодня это макро решение для другой цели.
ihightower
24

Чтобы сделать это в каждой строке файла:

:%normal J

или короче:

:%norm J

Чтобы сделать это только на части файла, выделите строки с помощью Vили получите диапазон другим способом:

:'<,'>global/^/normal J

или короче:

:'<,'>g/^/norm J
Кевин Панко
источник
Кевин, он хочет запустить две команды для каждого файла, а не только одну.
JNK
1
использование :gответов ОП нужно.
Люк Эрмитт
2
Это действительно присоединится к каждой второй линии. Попытайся!
Кевин Панко
Спасибо за globalтрюк. В моем случае, однако, запись макроса была проще и быстрее.
Болдевин
2
Просто предположение - он выполняет команду в каждой строке по порядку, и после выполнения первой строки вторая строка теперь исчезает (будучи объединенной с первой строкой), поэтому она вынуждена перейти к третьей строке.
Кевин Панко
9

Как насчет этого:

:g/$/j  

или

:g/$/j!  

и сгруппировать каждые три строки

:g/$/j3 
Miro
источник
1
Это ОЧЕНЬ хорошее решение Миро. Еще лучше то, что вы можете использовать это и в стандартном vi, хотя странным образом, когда вы используете конечный номер в SVR4.0 vi (как в Solaris) вместо j3, создающего 3 столбца, он равен 4. (так что вам нужно использовать J2 там для группировки каждые 3 строки)
JohnGH
0

Мы также можем играть с:

'<,'>g//s/.*\zs\n\ze.*/ /
Люк Эрмитт
источник
-1

Я не пользователь Vim, но проверяю онлайн документы, похоже

500(Jj) 

может работать, так как он разбирает вещи внутри скобок как единое целое.

JNK
источник
Хм, спасибо за попытку, но в моей версии Vim просто игнорирует скобки. Не могли бы вы сказать мне ссылку, где вы нашли этот синтаксис?
Болдевин
1
vimdoc.sourceforge.net/htmldoc/syntax.html - Извините, это не помогло!
JNK
На самом деле проверьте эту ссылку: vim.org/scripts/script.php?script_id=2136 посмотреть, если это делает то, что вы после.
JNK