Чи можу я виправдати текст у Vim?


38

Єдиною причиною, чому я коли-небудь редагував текстовий файл у Pico чи Nano, а не у Vim, була його команда «Виправдати» ^J. Він би переформатував абзац тексту, створивши розриви рядків при перервах слова, щоб текст добре плавав на екрані фіксованої ширини - форматувати текст так, щоб він міг відповідати попередньо 80 стовпцям, створюючи розриви рядків лише між словами. Як обмежена функція, це було дуже корисно, чи форматувати тривалі блоки коментарів, файли документації, або просто замінювати нескінченну рядок параметрів чимось більш читабельним.

Чи можу я зробити щось подібне у Vim?

Відповіді:


37

Ви можете використовувати gqабо gwоператори, поєднані з командою руху. За замовчуванням вона використовує fmtпрограму (в Linux) для форматування заданого тексту. Однак, наскільки мені відомо, це не виправдовує рядки, тому ви отримаєте нерівні праві межі.

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

Існує велика кількість конфігурацій, які можна зробити. Для початку, ось деякі важливі довідки: :h gq, :h gw, :h fo(параметри формату), :h fp(програма формату), :h fo-table(пояснення можливих варіантів).


1
gq / gw - це безумовно шлях. щоб додати до цього повідомлення, ви можете змінити програму формату на номінальну, щоб мати більше можливостей. Оформити замовлення vimcasts.org/episodes/formatting-text-with-par
Бамбу

3
За замовчуванням Vim не використовує жодної зовнішньої програми, хоча ви можете вибрати її, встановивши 'formatprg'опцію.
Jamessan

15

На цю тему є чудовий VimCast.

http://vimcasts.org/episodes/formatting-text-with-par/

В основному вам потрібно встановити par:

$ brew install par
# or
$ sudo apt-get install par

А потім, оскільки ви хочете, щоб стовпці були загорнуті в 80 стовпців:

:set formatprg=par\ -w80

Тепер ви можете використовувати gqоператор, як і в інших відповідях (наприклад gqip), і він буде використовувати Par замість вбудованого форматера Vim.

Пар досить просунутий, і він буде чудово форматувати коментарі:

/* This is a long */
/* multiline comment */

11

Від :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Отже, все, що вам потрібно зробити - це запустити

:ru macros/justify.vim

а потім наберіть

_j

щоб виправдати текст у всьому файлі.

(Звичайно, ви також можете додати ru macros/justify.vimу свій .vimrc, щоб вам не потрібно було вводити його щоразу.)

Примітка . Це не додає для вас розривів рядків. Додавати їх потрібно вручну gq. Для цього потрібно також встановити textwidth(за замовчуванням 0) на бажане значення через

set textwidth=80

і - якщо ви хочете - автоматичне загортання тексту, встановивши t-flag через

set formatoptions+=t

Якщо ви хочете, ви можете встановити відображення у вашому .vimrc, щоб зробити все за вас:

nnoremap <C-j> gggqG_j

Це переміщується на початок файлу ( gg), обгортає всі рядки ( gqдо G), а потім _jвиконує використання тексту.


Щоб детальніше ознайомитись із форматуванням, див .:
ВИМУЩЕ ВИКОРИСТАННЯ ВІМ-ВІД

Щойно я знайшов дуже корисний :set fo+=aваріант для автоматичного переформатування цілого абзацу. Погляньте на :help fo-tableінші варіанти. Там також хороші відео - підручник тут .
Suuuehgi

+1 для повністю вбудованого рішення. _jВідображення доданий макрос , здається, виправдовує весь файл для мене, або він може бути обмежений за допомогою візуального вибору через підрядник.
чес

5

Хоча допомога нано викликає ^Jкоманду "Виправдати", вона насправді не виправдовує текст, але він переформатує текст, порушуючи рядки перед правим полем екрана (або, напевно, в якомусь настроюваному стовпці, я думаю).

Ви можете зробити те ж саме в VIM, встановивши змінну textwidth, з :help 'textwidth':

Максимальна ширина тексту, який вставляється. Білий пробіл буде розірваний після пробілу для отримання цієї ширини. Нульове значення відключає це.

Тобто: під час набору тексту, якщо рядок довший textwidthсимволів, VIM оберне рядок на першому просторі, щоб довжина рядка була меншою або рівною textwidth.

Для цього варіант formatoptionsповинен містити лист t. Дивіться :help 'formatoptions'і :help fo-tableдля наявних варіантів, наприклад , ви можете бути зацікавлені в cопції , щоб зробити форматування роботи з коментарями.

Edit : Ви можете виконати ту ж саму операцію, без необхідності покласти tв formatoptions, використовуючи команду gw{motion}, він форматує текст між поточним положенням курсора і положенням курсору після {motion}. gwКоманда доступна також в візуальному режимі, то форматування виділеного тексту.


1
Це добре для набору тексту. Чи можу я застосувати це до вже існуючого тексту?
СФ.

3

Ось два простих варіанти:

  1. з виділеним блоком тексту, наберіть !fmt
  2. введіть курсор на початку блоку !}fmt

Обидва вони надсилають блок тексту в unix fmt, див. man fmtВаріанти. Ви можете передавати аргументи опції від vim. Наприклад, для форматування блоку шириною 50 символів введіть !}fmt -w 50.


Вибачте за це, виправлено зараз
Каан

Ви також можете відформатувати весь файл, ввівши :%!fmtта скасувати один, uякщо результат не сподобався.
Wildcard

-1

Позначте текст за допомогою візуальної команди та використовуйте:

:!par 40j 

де 40 - ширина стовпця і jозначає обґрунтування.


2
Ласкаво просимо на наш сайт! На сьогодні ваше запитання низької якості, оскільки йому не вистачає пояснень про інструмент, який ви використовуєте ( par), і чому ваше рішення працює. Ви можете додати більше деталей, щоб покращити якість своєї відповіді та зробити її кориснішою для майбутніх читачів.
statox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.