Як я можу автоформатувати / відступати код C у форматі vim?


250

Коли я копіюю код з іншого файлу, форматування буде зіпсовано, як це:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}

Як я можу автоформатувати цей код у vim?


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

Відповіді:


566

Спробуйте наступні натискання клавіш:

gg=G

Пояснення: ggпереходить у верхню частину файлу, =це команда виправити відступ і Gкаже йому виконати операцію до кінця файлу.


28
це лише відступ коду. може щось не зробити, щоб АВТОФОРМАТИВАТИ всю справу?
N 1.1,

7
Яка різниця?
Тон ван ден Хевель

3
@Ton van: Дивіться мою відповідь на різницю (Не міг би пояснити тут у коментарях).
Лазер

2
-1 Це виправляє лише відступи, а не форматування (про що вимагали).
олігофрен

3
@oligofren Приклад ОП включав лише помилки відступу, і він приймає відповідь, так що я думаю, саме це він мав на увазі.
Амір Рахум

78

Мені подобається користуватися програмою Artistic Style. За їхнім веб-сайтом :

Художній стиль - це індектор вихідного коду, форматер та красувач для мов програмування C, C ++, C # та Java.

Він працює в Window, Linux та Mac. Він буде робити такі речі, як відступ, замінюючи вкладки пробілами або навпаки, розміщуючи пробіли навколо операцій, як вам більше подобається (перетворюється if(x<2)на, якщо ( x<2 )це так вам подобається), ставлячи дужки в ту саму лінію, що і визначення функцій, або переміщуючи їх до рядок нижче і т. д. Усі параметри контролюються параметрами командного рядка.

Для того, щоб використовувати його в vim, просто встановіть на нього опцію formatprg, а потім скористайтеся командою gq. Так, наприклад, у мене є .vimrc:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

так що коли я відкриваю .cpp файл, formatprg встановлюється з параметрами, які мені подобаються. Потім я можу набрати gg, щоб перейти до верхньої частини файлу та gqGвідформатувати весь файл відповідно до моїх стандартів. Якщо мені потрібно лише переформатувати одну функцію, я можу перейти до верхньої частини функції, а потім введіть gq][і вона буде переформатувати саме цю функцію.

Варіанти для astyle, -T4pb- це лише мої вподобання. Ви можете переглядати їхні документи та змінювати параметри, щоб він форматував код, скільки завгодно.

Ось демонстрація. Перед стилем:

int main(){if(x<2){x=3;}}

float test()
{
if(x<2)
x=3;
}

Після стилю (gggqG):

int main()
{
    if (x < 2)
    {
        x = 3;
    }
}

float test()
{
    if (x < 2)
        x = 3;
}

Сподіваюся, що це допомагає.


3
Чи є щось подібне для інших форматів; ruby, xml, json тощо?
derGral

1
@Ryan перевірити vim-autoformat, див. Відповідь нижче. BTW vim-autoformat також використовує astyle серед інших.
Chiel ten Brinke

1
Дякую! Я починав думати, що я єдина людина в слові, яка не хотіла, щоб їх відкривальні дужки були в тому ж рядку, що і декларація функції!
користувач3640967

27

Команда вбудованого для правильного відступу коду вже згадана ( gg=G). Якщо ви хочете прикрасити код, вам потрібно буде використовувати зовнішній додаток, як відступ . Оскільки %позначає поточний файл у колишньому режимі, ви можете використовувати його так:

:!indent %

13

Плагін vim-autoformat дозволяє форматувати ваш буфер (або вибір буфера) за допомогою однієї команди: https://github.com/Chiel92/vim-autoformat . Для цього для цього використовуються програми зовнішнього формату з відступом до функціональних можливостей відступу vim.


11

Я знаходжу це clang-format працює добре.

Існує кілька прикладів сполучень клавіш у програмі документації кланг

Я вважаю за краще використовувати equalprgзв'язування in vim. Це дозволяє звертатися clang-formatдо того G=ggчи іншого= відступних параметрів.

Просто помістіть у свій .vimrc файл:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Потрібно спочатку встановити його, наприклад, для ubuntu 16.04+:sudo apt install clang-format
Ерік Ван

3

Можливо, ви можете спробувати наступні $ indent -kr -i8 * .c

Сподіваємось, це вам корисно!


3

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

  1. Виберіть блок коду, який ви хочете відформатувати, Vабо подібний.
  2. Форматування, ввівши :!indent.

astyle також приймає stdin, тож ви можете використовувати ту саму хитрість.


3

Я хотів додати, що для того, щоб не заплутатися в першу чергу, ви можете набрати :set pasteперед вставкою. Після вставки можна набрати :set nopasteтакі речі, як js-прикрасити і відступи, щоб знову працювати.


1
Я використовую :set paste!для цього, що перемикає значення вставки, а не встановлює її. Це полегшує вимкнення, оскільки ви можете просто прокрутити кілька команд назад і натиснути клавішу Enter.
a'r

0

Їх називають інструментом indent. Ви можете завантажити його apt-get install indent, а потім запустити indent my_program.c.

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