Как я могу автоматически отформатировать / сделать отступ для кода C в vim? - PullRequest
228 голосов
/ 01 марта 2010

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

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

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

Ответы [ 10 ]

523 голосов
/ 01 марта 2010

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

gg=G

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

77 голосов
/ 02 марта 2010

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

Artistic Style - это индентор, форматировщик и beautifier исходного кода для языков программирования C, C ++, 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 ] [ и он переформатирует только эту функцию.

Опции, которые у меня есть для astyle, -T4pb, это только мои предпочтения. Вы можете просмотреть их документы и изменить параметры, чтобы форматировать код так, как вам нравится.

Вот демо. Перед стилем:

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;
}

Надеюсь, это поможет.

54 голосов
/ 21 ноября 2010

ОП запросил автоформатирование, но принял ответ, который выполняет только авто-отступ.

Вот разница:

ORIGINAL

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;
}
26 голосов
/ 01 марта 2010

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

:!indent %
13 голосов
/ 03 декабря 2012

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

9 голосов
/ 27 октября 2016

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

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

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format
3 голосов
/ 13 февраля 2015

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

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

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

3 голосов
/ 23 сентября 2011

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

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

1 голос
/ 02 февраля 2017

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

0 голосов
/ 06 февраля 2017

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

...