Об’єднайте рядки всередині абзаців vim


13

Припустимо, ви набрали довгий документ vim з автоматичним розривом рядка, тому всі рядки були розбиті на, скажімо, 79 символах. Можливо, ви навіть застосували форматування до всього документа, щоб розбити всі рядки на цій довжині.

Абзаци розміщені у вашому документі порожніми рядками.

Тепер ви вирішите, що взагалі не хочете розривів рядків в абзацах.

Як можна видалити всі розриви рядків в абзацах, не усуваючи межі абзацу взагалі?

Я зробив цей швидкий і ідіотський злом, але шукаю правильний шлях.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

ей, не стукайте, якщо ваше рішення працює, і ваше рішення працює.
pdwalker

Відповіді:


12

Я думаю, що це робить те, що ви хочете: переконайтеся, що в кінці файлу є порожній рядок, а потім приєднайтесь до кожного абзацу (закінчується порожнім рядком).

G:a

.
:g/^./ .,/^$/-1 join

Пояснення: спочатку перейдіть до кінця файлу і додайте зайвий порожній рядок :a(можливо, є більш елегантний спосіб зробити це; в інтерактивному режимі ви можете замінити перші три рядки на o<ESC>). Потім для кожного непорожнього рядка, який ще не розглянуто ( :g/^./), застосуйте joinкоманду до діапазону, починаючи з обраного рядка ( .) і закінчуючи один рядок перед наступним порожнім рядком ( /^$/-1).

За бажанням, :g/^$/dякщо ви не хочете, щоб жоден порожній рядок залишався (ви можете зняти його -1).


Дякую. Це дуже близьке для мене, однак це видалення порожніх рядків між абзацами. (Я спробував файловий формат unix і дос, щоб побачити, чи це річ Windows). Також ви могли трохи перекласти команди? G переходить до останнього рядка. : a згідно довідки "додається", але я не впевнений, що це робить. Також мене загубив g / pattern / cmd, який у вас є. Яка команда?
dggoldst

@dggoldst: Я змінив команду щодо збереження порожніх рядків. Перші три рядки - просто додати порожній рядок у кінці файлу (інакше останній абзац не буде збігатися). Остання команда :g, яка застосовує команду до всіх збігаються рядків; див. :help :gі, можливо, цей потік про те, як :gповодиться при видаленні розривів рядків .
Жил 'ТАК - перестань бути злим'

:$pu _ в кінці ставлять регістр чорної діри, що призводить до порожнього рядка в кінці.
SergioAraujo

12

Це слід зробити:

:set tw=99999
gggqG

twвстановлюється деяке значення, принаймні таке велике, як кількість символів у найдовшому абзаці. ggпереміщує курсор до першого рядка; gqце команда переформатувати; Gпереміщує курсор до останнього рядка, кажучи gqпереформатуватися з поточного місця розташування курсору в останній рядок.


5
  1. Встановіть курсор усередині потрібного абзацу

  2. Тип: vipJ

( vipвиділяє поточний абзац, Jприєднується до всіх рядків)


2

Можливо, це не найчистіший спосіб зробити це, але ось що я б використав:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Працює у VIM 7.2. )

Залежно від того, яким чином розділилися абзаци, коли вони були спочатку форматовані, ви можете замінити gJкоманду (приєднатись без пробілів) Jкомандою (об'єднати з пробілами).

Довільний 999підрахунок повинен становити принаймні кількість абзаців у файлі - ви можете вибрати більшу кількість, якщо хочете і нічого не втратити, крім циклів процесора. Припускаючи один і єдиний порожній рядок між абзацами, ви можете отримати більш точний підрахунок абзацу, використовуючи:

:%s/^$//gn     # returns "999 matches on 999 lines"

Це працює для мене. Було б добре додати "gg" на початку, щоб поставити курсор у верхній частині файлу. Крім того, використання J замість gJ не призводить до того, що окремі слова збиваються в одне ціле. Можливо, це стосується лише моїх значень "форматографій", які зараз мене спантеличують.
dggoldst
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.