Как мога да създам autoformat / indent C код в vim?

Когато копирам код от друг файл, форматирането е объркано, например:

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

Как мога автоматично да форматирам този код във vim?

189
01 марта '10 в 15:50 2010-03-01 15:50 Yongwei Xing е на 01.03.2010 г. в 15:50 2010-03-01 15:50
@ 10 отговора

Изпробвайте следните клавиши:

 gg=G 

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

427
01 марта '10 в 15:52 2010-03-01 15:52 Отговорът е даден от Амир Рахум на 01.03.2010 г. в 15:52 2010-03-01 15:52

Обичам да използвам програмата Artistic Style. Според уебсайта им:

Художественият стил е индентор на изходния код, форматиране и декодер на изходния код за езиците за програмиране 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 ] [ и да преформатира тази конкретна функция.

border=0

Опциите, които имам за astil, -T4pb , са само моите предпочитания. Можете да видите техните документи и да промените настройките, за да форматирате кода по ваш вкус.

Ето демонстрация. Преди астил:

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

След Astil (gggqG):

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

Надявам се това да помогне.

71
02 марта '10 в 16:46 2010-03-02 16:46 Отговор е даден от Derek на 02 март 2007 г. в 4:46 2010-03-02 16:46

Операционната система поиска автоматично форматиране, но прие отговор, който прави само автоматичното индексиране.

Ето разликата:

ORIGINAL

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

autoindent

 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; } 
50
21 нояб. отговорът е даден от lazer 21 nov. 2010-11-21 10:46 '10 в 10:46 ч. 2010-11-21 10:46

Вградената команда за правилно отстъпване на код вече е спомената ( gg=G ). Ако искате да декорирате кода, трябва да използвате външно приложение, например отстъп . Тъй като % означава текущия файл в бивш режим, можете да го използвате, както следва:

 :!indent % 
23
01 марта '10 в 16:04 2010-03-01 16:04 Отговор е даден от soulmerge 01 март в 16:04 2010-03-01 16:04

Приставката vim-autoformat ви позволява да форматирате буфера само с един бутон: https://github.com/Chiel92/vim-autoformat . За тази цел той използва програма за външен формат, като се отклонява от функционалността vim indent.

12
02 дек. Отговор, даден от Chiel ten Brinke 02 декември 2012-12-02 23:09 '12 в 23:09 2012-12-02 23:09

Намирам, че c> работи добре.

Има няколко примера за ключови думи в документацията.

Предпочитам да използвам equalprg в vim. Това ви позволява да извикате c> с G=gg или други параметри на отстъп = .

Просто поставете следното във вашия .vimrc файл:

 autocmd FileType c,cpp setlocal equalprg=c> 
4
27 окт. Отговор Daniel 27 oct. 2016-10-27 05:34 '16 в 5:34 am 2016-10-27 05:34

Харесва ми indent , както споменах по-горе, но през повечето време искам да форматирам само малката част от файла, върху който работя. Тъй като indent може да приеме код от stdin, неговата много проста:

  • Изберете блока от код, който искате да форматирате с V или други подобни.
  • Форматирайте, като напишете :!indent .

astyle също приема stdin, така че можете да използвате същия трик.

3
13 февр. отговорът е даден от dsummersl 13 февруари 2015-02-13 17:41 '15 в 17:41 2015-02-13 17:41

Може би можете да опитате следния $ indent -kr -i8 * .c

Надявам се, че това ще ви бъде от полза!

2
23 сент. Отговорът е даден lattimore 23 sep . 2011-09-23 08:59 '11 в 8:59 2011-09-23 08:59

Техният инструмент се нарича indent . Можете да го изтеглите с apt-get indent , след това изпълнете indent my_program.c .

0
06 февр. отговорът е даден на n0va_sa 06 февруари. 2017-02-06 11:44 '17 в 11:44 2017-02-06 11:44

Исках да добавя, че за да се избегне преливане, преди всичко можете да напишете :set paste преди поставяне. След вмъкването можете да въведете :set nopaste за неща като js-beautify и indenting, за да работите отново.

0
02 февр. отговорът е даден atripes 02 Feb. 2017-02-02 12:01 '17 в 12:01 часа 2017-02-02 12:01

Други въпроси относно маркерите или Задайте въпрос