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

250

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

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

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

Юнвэй Син
источник
3
Для тех, кто ищет форматирование, а не просто отступ в коде, второй ответ (мой) касается этого. Если вы просто хотите исправить отступ, принятый ответ - самый простой способ.
Дерек

Ответы:

566

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

gg=G

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

Амир Рахум
источник
28
это только отступы кода. нельзя ли что-то сделать, чтобы АВТОФОРМАТИРОВАТЬ все это?
N 1,1
7
В чем разница?
Тон ван ден Хеувел
3
@ Тон Ван: Смотрите мой ответ на разницу (не могли бы объяснить здесь в комментариях).
Лазер
2
-1 Это исправляет только отступ, а не форматирование (о чем просили).
oligofren
3
@oligofren Пример OP включал только ошибки отступов, и он принимает ответ, так что, я думаю, именно это он и имел в виду.
Амир Рахум
78

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

Artistic Style - это индентор, форматер и beautifier исходного кода для языков программирования 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
@ Райан проверьте vim-автоформат, см. Ответ ниже. Кстати, vim-autoformat также использует astyle среди других.
Чиль тен Бринке,
1
Спасибо! Я начинал думать, что я был единственным человеком в слове, который не хотел, чтобы их открывающие скобки были в той же строке, что и объявление функции!
user3640967
27

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

:!indent %
soulmerge
источник
13

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

Чиль тен бринке
источник
11

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

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

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

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

autocmd FileType c,cpp setlocal equalprg=clang-format
Даниил
источник
3
Сначала нужно установить его, например, для Ubuntu 16.04+:sudo apt install clang-format
Eric Wang
3

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

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

Латтимор
источник
3

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

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

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

dsummersl
источник
3

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

atripes
источник
1
Я использую :set paste!для этого, который переключает значение вставки вместо установки его. Это облегчает выключение, так как вы можете просто прокрутить несколько команд назад и нажать Enter.
a'r
0

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

n0va_sa
источник