Когда я копирую код из другого файла, форматирование перепутано, например:
fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}
Как я могу автоматически форматировать этот код в vim?
Когда я копирую код из другого файла, форматирование перепутано, например:
fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}
Как я могу автоматически форматировать этот код в vim?
Попробуйте выполнить следующие нажатия клавиш:
gg=G
Объяснение: gg
переходит в начало файла, =
- это команда для исправления отступа и G
сообщает ему выполнить операцию в конце файла.
Мне нравится использовать программу 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;
}
Надеюсь, что это поможет.
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
). Если вы хотите украсить код, вам нужно использовать внешнее приложение, например indent. Поскольку %
обозначает текущий файл в ex-режиме, вы можете использовать его следующим образом:
:!indent %
Плагин vim-autoformat позволяет форматировать буфер (или выбор буферов) с помощью одной команды: https://github.com/Chiel92/vim-autoformat. Для этого он использует программы внешнего формата с отступлением к функциональности отступов vim.
Я считаю, что clang-format
работает хорошо.
Есть несколько примеров сочетаний клавиш в документации Clang
Я предпочитаю использовать привязку equalprg
в vim. Это позволяет вам вызывать clang-format
с опциями G=gg
или other =
indent.
Просто поместите в ваш файл .vimrc следующее:
autocmd FileType c,cpp setlocal equalprg=clang-format
Возможно, вы можете попробовать следующее $indent -kr -i8 *.c
Надеюсь, это будет полезно для вас!
Мне нравится indent
, как упоминалось выше, но чаще всего я хочу отформатировать только небольшой раздел файла, над которым я работаю. Поскольку indent
может принимать код из stdin, его действительно просто:
:!indent
. astyle
тоже принимает stdin, поэтому вы можете использовать тот же трюк.
Я хотел добавить, что во избежание его переполнения в первую очередь вы можете ввести :set paste
перед вставкой. После вставки вы можете набрать :set nopaste
для таких вещей, как js-beautify и indenting, чтобы снова работать.
Их инструмент называется indent
. Вы можете скачать его с помощью apt-get install indent
, а затем запустить indent my_program.c
.