команда vim для реструктуризації / примусового тексту до 80 стовпців


240

Я знаю, що існують способи автоматичного встановлення ширини тексту у форматі vim set textwidth(наприклад, стосується компонування стовпців Vim 80 ). Я шукаю щось подібне до =(команда рядка відступу), але обертання до 80. Застосування використання - це іноді ви редагуєте текст із шириною тексту, а після з'єднання рядків або видалення / додавання тексту він виходить погано завернутим.

В ідеалі ця команда повністю б реорганізувала вибрані рядки і відсікала довгі рядки, додаючи до коротких. Приклад:

long line is long!  
short

Після запуску команди (припустимо, що обертання склало 13 cols):

long line is  
long! short

Якщо це неможливо за допомогою вірної команди vim, можливо, існує програма командного рядка, яка робить це, на що я можу подати вхід?

Після пошуку я знайшов цю посилання, яке має ще кілька варіантів: http://www.cs.swarthmore.edu/help/vim/reformatting.html


9
Можливо, вам також буде цікаво дізнатися, що Vim може делегувати форматування тексту зовнішній програмі, наприклад, пар . Я зробив скріншот, який демонструє, як форматувати текст з номіналом .
нельстром

@nelstrom дякую, TIL о par. Це фантастично!
Стівен Лу

2
Коли ви хочете, щоб текст виглядав тонким і обробленим (добре вирізаним?), Завжди думайте про gq- Gentleman's Quarterly . (Вибачення за антропоморфізацію чоловіків, але
мнемонія

Відповіді:


372

Встановіть textwidthзначення 80 ( :set textwidth=80), перейдіть до початку файлу (можна зробити з Ctrl- Homeабо gg) та введіть gqG.

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


14
І це також працює з візуальними виділеннями. Тобто що - щось на кшталт: V}gq. Таким чином ви бачите, що ви будете форматувати, перш ніж його фактично форматувати.
Plouff

6
До речі, що саме робить qсам?
Річард-Деген

1
Чи є спосіб це зробити за допомогою рядків, які є лише однією довгою рядком символів, без пробілів? EDIT: Я відкрив утиліту "fold". Досі цікаво робити це in vi.
Дональд Сміт

7
використовуйте set tw=80замість того, set textwidth=80щоб заощадити час
Yibo Yang

4
@dmranck Після set textwidth=76введення тексту рядки автоматично перегортаються. Моя скарга полягає в тому, що вона не робить нічого, коли існуючі рядки редагуються. Але V}gqвкрай корисний у цьому плані. Vпереходить у режим візуального вибору, }вибирається до наступного перерви абзацу та gqвиконує поточний формат на ньому (або використовує gwдля явного виклику форматора vi). Також {виберемо вгору. Ви можете вибрати весь документ та формат, ggVGgqхоча, можливо, є простіший спосіб. Збережіть це як макрос, @щоб зробити його простіше. Використовуйте vipgqдля fmt поточного абзацу.
ktbiz

94

Рішення Майкла є ключовим, але я найчастіше виявляю, що хочу переформатувати решту поточного абзацу; для такої поведінки використовуйте gq}.


17
розширення на цьому - ви можете використовувати gq <motion> для форматування всього, що хочете.
Дан Шнау

1
Також опція 'nojoinspaces', яка запобігає появі двох пробілів після періодів, коли рядки з'єднуються в межі речення. Добре, коли ваш типографічний стиль - це проміжки між реченнями англійською мовою.
Алекс Гірзель

36

Ви можете використовувати gqз будь-якими операторами руху. Наприклад, якщо ви хочете лише переформатувати до кінця поточного рядка (тобто обернути рядок, на якому знаходиться ваш курсор), ви можете використовуватиgq$

Ви також можете переформатувати, вибравши текст у візуальному режимі (використовуючи `v і переміщення), а потім набравши gq.

Є й інші варіанти примушування ліній до загортання.

Якщо ви хочете, щоб vim обертав ваші рядки, вставляючи в них текст, замість того, щоб чекати до кінця, щоб реструктурувати текст, ви знайдете ці варіанти корисними:

:set textwidth=80
:set wrapmargin=2

(Не отримуйте сторонне відстеження wrapі linebreak, яке лише переформатує текст, що відображається на екрані, і не змінює текст у буфері)


9
З wrapmarginдовідки: Якщо значення "textwidth" не дорівнює нулю, ця опція не використовується.
mmoya

21

Завдяки коментарю DonaldSmith я виявив це, оскільки textwidthваріант не переформатував мій довгий рядок тексту (я перетворював граючи з шестнадцятибайтовими перетвореннями):

:%!fold -w 60

Це перетворило весь файл (який був для мене одним рядком) у рядки довжиною 60.


1
Це дуже приємно. Усі відповіді фокусуються на обмеженні ширини рядка, коли лінія розділена пробілами на слова. Це рішення працює для дуже довгих слів (послідовностей ДНК).
pedrosaurio

1
Для довгих URL-адрес це про єдине, що я знайшов, що працює. Я вже новий про
ширину тексту,

13

Якщо ви шукаєте не-Vim спосіб, завжди є команди UNIX fmt та par .

Примітки:

  • Я не можу коментувати Unicode, він може чи не може поводитися інакше.
  • @nelstrom вже згадував про використання parу своїй веб-трансляції.

Ось як ми використали б обидва для вашого прикладу.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Для використання зсередини Vim:

:%! fmt -w 13
:%! par 13gr

Ви також можете встановити параметр :formatprgабо fmt та переотримати gq. Для отримання додаткової інформації зателефонуйте до :help formatprgVim.


9

Майже завжди я використовую gqу візуальному режимі. Я кажу своїм студентам, що воно розшифровується як "Квартал джентльменів", журнал для вибагливих людей.

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