Як зламати довгі рядки в vim?


12

У мене досить великий текстовий файл, сформований з подібних блоків

Short line.
Really long line.
Short line.

розділені порожніми рядками, і я хотів би використовувати vim (на Linux), щоб розбити довгі рядки та отримати блоки типу

Short line.
This was
part of
a long line.
Short line.

Моя проблема з gqgw) полягає в тому, що він поповнює кожен блок як цілий абзац, тобто він не зберігає два розриви рядків у кожному блоці, і відповідно до :help fo-tableжодного з gqпараметрів формату не дозволить мені робити те, що я хочу. Я також думав, що можу досягти своєї мети, якщо зможу визначити символи нового рядка як роздільники абзацу, але згідно з :help paragraphцими твердими кодами.

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


До речі: я шукав рішення своєї проблеми в документації vim, тут і в SU, і в Інтернеті, з'являючись порожнім. Я з радістю видалю це питання, якщо я не помітив щось очевидне.
AP


@ MartinSchröder: Радий знати, що є SE SE! Ці відповіді не стосуються мого питання, хоча я вже знав про gqта gw. Я також радий, що не зупинився на цьому, інакше я б не дізнався про :gкоманду. :)
AP

Відповіді:


16
:%norm! gww

Це застосовується normalкоманда gww(яка форматує поточний рядок як і з gw) на весь буфер, не беручи до уваги налаштовані відображення (щоб уникнути проблем, якщо наприклад gw, було відображено щось інше).

Побачити

  • :help :%
  • :help :norm
  • :help gww

Ця альтернатива, згідно з пропозицією Бена в коментарях, є більш простою, ніж оригінальне рішення, яке зберігається внизу, оскільки воно може краще вписуватися в інших подібних обставинах через регулярну здатність до вирівнювання виразів. У випадку "матчу всіх ліній" це, однак, зайве.


Застосовуючи програму gwwдля кожного окремого рядка в буфері:

:g/^/norm gww

Дивіться :help :gі :help norm. ^відповідає початку рядка, що на практиці робить цю відповідність кожному рядку.

Можна також вибрати лише рядки довше, наприклад, 60 символів

:g/\%>60v/norm gww

(див. :help \%<), але на практиці gwwбуде лише переформатувати лінії довше, ніж textwidthвсе одно, тому це може не мати великого значення ні в швидкості, ні в результаті.

(Я використовую vдля "віртуальної колонки" замість c"колонки", оскільки останній дійсно обчислює певну кількість байтів у рядку. Це може призвести до несподіваних результатів при використанні багатобайтових кодувань, що часто є причиною насторожитися. На практиці це не справжнє питання з тієї ж причини, що і вище, щодо того, що gwwце не буде переформатувати лінії, коротші, ніж у textwidthбудь-якому випадку.)


Очевидно, :gвиходить з ладу без шаблону, тому :g//norm gwwне працює, але :g/.*/norm gwwробить.
AP

@AP: Ага, працює на мене. Я використовую Vim 7.4.488-6 від Debian Unstable.
Даніель Андерссон

4
:g//повторно використовує останній шаблон пошуку; якщо його немає, він виходить з ладу. Використовуйте :g/^/для застосування до всіх рядків.
Інго Каркат

@IngoKarkat: Ах, має сенс, оскільки моїм останнім шаблоном під час тестів була відома довжина лінії, яку я демонстрував пізніше. Я оновлю відповідь. Чи знаєте ви, де в довідці згадується ця поведінка "порожнього шаблону"? Я не можу це тривіально знайти.
Даніель Андерссон

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

4

Так як ви вже прочитали керівництво для gqі gwкоманд, я вважаю , ви , ймовірно , хочете що - то більш зручне , ніж вручну переміщення в довгі черги , а потім використовувати gw0, gw$або іншу gwкоманду тільки форматувати поточний рядок.

Я не знаю простого способу переривання довгих рядків у Vim над текстовим блоком. Однак, оскільки ви згадали, що використовуєте Vim у системі GNU / Linux, я б запропонував фільтрувати ваш текст за допомогою fmtкоманди GNU .

Для всього файлу:

:%!fmt --width=75 --split-only

Для поточного абзацу (використовуючи короткі параметри):

:'{,'}!fmt -75 -s

Пояснення відповідних fmtваріантів:

  • -w, --width=WIDTH- максимальна ширина рядка (за замовчуванням 75 стовпців). Опція -WIDTHє скороченою формою --width=DIGITS(якщо використовується ця скорочена версія, вона повинна бути першою опцією).

  • -s, --split-only- розділити довгі лінії, але не заправляти; це варіант, який зберігає ваші попередні перерви на жорсткій лінії.


Дякуємо за згадування fmt. Я вважав за краще прийняти іншу відповідь, тому що вона вимагає лише vim.
AP

@AP Не хвилюйтесь. Це чудова відповідь, і я сам би це прийняв. І це, і ваше питання заслуговують підсумків.
Ентоні Геоґеган

1

Від:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

Поставлення маркера на лінію "lorem ipsum" і натискання gwwвиходів (з textwidth=40метою наочності):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

що мені здається таким, про що ви просите. Якщо ні, будь ласка, не соромтеся уточнити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.