Как я могу создать код autoformat/indent C в vim?

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

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

Как я могу автоматически форматировать этот код в vim?

Ответ 1

Попробуйте выполнить следующие нажатия клавиш:

gg=G

Объяснение: gg переходит в начало файла, = - это команда для исправления отступа и G сообщает ему выполнить операцию в конце файла.

Ответ 2

Мне нравится использовать программу Artistic Style. Согласно их веб-сайту:

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

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

Чтобы использовать его в vim, просто установите для него параметр formatprg, а затем используйте команду gq. Так, например, у меня в моем .vimrc:

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

так что всякий раз, когда я открываю файл .cpp, formatprg устанавливается с параметрами, которые мне нравятся. Затем я могу напечатать gg, чтобы перейти к началу файла, и g q g, чтобы отформатировать весь файл в соответствии с моими стандартами. Если мне нужно только переформатировать одну функцию, я могу перейти в начало функции, а затем введите g q ] [ и она переформатирует именно эту функцию.

Параметры, которые у меня есть для астиля, -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

OP запросил автоматическое форматирование, но принял ответ, который делает только автоиндексирование.

Вот разница:

ОРИГИНАЛ

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

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

автоотступами

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

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

Автоформат

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

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

Ответ 4

Уже упоминалась встроенная команда для правильного отступов кода (gg=G). Если вы хотите украсить код, вам нужно использовать внешнее приложение, например indent. Поскольку % обозначает текущий файл в ex-режиме, вы можете использовать его следующим образом:

:!indent %

Ответ 5

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

Ответ 6

Я считаю, что clang-format работает хорошо.

Есть несколько примеров сочетаний клавиш в документации Clang

Я предпочитаю использовать привязку equalprg в vim. Это позволяет вам вызывать clang-format с опциями G=gg или other = indent.

Просто поместите в ваш файл .vimrc следующее:

autocmd FileType c,cpp setlocal equalprg=clang-format

Ответ 7

Возможно, вы можете попробовать следующее $indent -kr -i8 *.c

Надеюсь, это будет полезно для вас!

Ответ 8

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

  • Выберите блок кода, который вы хотите отформатировать, с помощью V или тому подобного.
  • Формат, набрав :!indent.

astyle тоже принимает stdin, поэтому вы можете использовать тот же трюк.

Ответ 9

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

Ответ 10

Их инструмент называется indent. Вы можете скачать его с помощью apt-get install indent, а затем запустить indent my_program.c.