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

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

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

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

10 ответов


попробуйте следующие комбинации клавиш:

gg=G

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


мне нравится использовать художественный стиль программы. Согласно их сайт:

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

он работает в окне, 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, это только мои предпочтения. Вы можете посмотреть через их документы, и изменить параметры, чтобы иметь его формат код, как вам нравится.

вот демо. Перед astyle:

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

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

после astyle (gggqG):

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

float test()
{
    if (x < 2)
        x = 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;
}

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

:!indent %

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


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

есть некоторые примеры Привязок клавиш в документация clang

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format

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

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

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


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

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


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


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