ฉันจะจัดรูปแบบรหัส C อัตโนมัติ / เยื้องในกลุ่มได้อย่างไร?


250

เมื่อฉันคัดลอกโค้ดจากไฟล์อื่นการจัดรูปแบบจะเลอะเช่นนี้:

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

ฉันจะจัดรูปแบบอัตโนมัติของรหัสนี้เป็นกลุ่มได้อย่างไร


3
สำหรับทุกคนที่ต้องการจัดรูปแบบและไม่เพียง แต่เยื้องรหัสคำตอบที่สอง (ฉัน) ที่อยู่ที่ หากคุณต้องการแก้ไขการเยื้องคำตอบที่ยอมรับเป็นวิธีที่ง่ายที่สุด
Derek

คำตอบ:


566

ลองกดแป้นต่อไปนี้:

gg=G

คำอธิบาย: ggไปที่ด้านบนของไฟล์=เป็นคำสั่งเพื่อแก้ไขการเยื้องและGบอกให้ดำเนินการจนถึงจุดสิ้นสุดของไฟล์


28
นี่เป็นเพียงการเยื้องรหัส AUTOFORMAT ไม่สามารถทำสิ่งใดกับสิ่งทั้งหมดได้หรือไม่
N 1.1

7
อะไรคือความแตกต่าง?
Ton van den Heuvel

3
@ รถตู้: ดูคำตอบของฉันสำหรับความแตกต่าง (ไม่สามารถอธิบายได้ที่นี่ในความคิดเห็น)
Lazer

2
-1 เพียงแก้ไขการเยื้องไม่ใช่การจัดรูปแบบ (ซึ่งเป็นสิ่งที่ถูกถาม)
oligofren

3
@oligofren ตัวอย่างของ OP มีเพียงข้อผิดพลาดการเยื้องและเขายอมรับคำตอบดังนั้นฉันเดาว่านั่นคือสิ่งที่เขาหมายถึง
Amir Rachum

78

ฉันชอบใช้โปรแกรมสไตล์ศิลปะ ตามเว็บไซต์ :

Artistic Style เป็นซอร์สโค้ดตัวจัดรูปแบบและตัวเสริมความงามสำหรับภาษาการเขียนโปรแกรม 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เป็นเพียงความชอบของฉัน คุณสามารถดูเอกสารของพวกเขาและเปลี่ยนตัวเลือกเพื่อให้มันจัดรูปแบบรหัสตามที่คุณต้องการ

นี่คือตัวอย่าง ก่อนที่จะ 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;
}

หวังว่าจะช่วย


3
มีสิ่งนี้ในรูปแบบอื่นหรือไม่ ruby, xml, json เป็นต้น
derGral

1
@ ตรวจสอบ vim-autoformat ดูคำตอบด้านล่าง BTW vim-autoformat ยังใช้ astyle และอื่น ๆ
Chiel ten Brinke

1
ขอบคุณ! ฉันเริ่มคิดว่าฉันเป็นคนเดียวในคำที่ไม่ต้องการวงเล็บเปิดในบรรทัดเดียวกับการประกาศฟังก์ชั่น!
3640967

27

คำสั่ง builtin สำหรับการเยื้องรหัสได้ถูกกล่าวถึงแล้ว ( gg=G) หากคุณต้องการที่จะสวยงามรหัสที่คุณจะต้องใช้โปรแกรมประยุกต์ภายนอกเช่นเยื้อง เนื่องจาก%หมายถึงไฟล์ปัจจุบันในโหมด ex คุณสามารถใช้มันดังนี้:

:!indent %

13

ปลั๊กอินเป็นกลุ่ม-อัตโนมัติช่วยให้คุณสามารถจัดรูปแบบบัฟเฟอร์ของคุณ (หรือ buffer เลือก) มีคำสั่งเดียว: https://github.com/Chiel92/vim-autoformat จะใช้โปรแกรมรูปแบบภายนอกสำหรับการที่มีทางเลือกในการเยื้องฟังก์ชั่นการเยื้องของกลุ่ม


11

ฉันพบว่าใช้clang-formatงานได้ดี

มีตัวอย่าง keybindings ในเอกสาร clang

ฉันชอบใช้การequalprgรวมเป็นกลุ่ม นี้ช่วยให้คุณสามารถเรียกใช้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 ใช้ stdin ด้วยดังนั้นคุณสามารถใช้เล่ห์เหลี่ยมเดียวกันได้


3

ฉันต้องการเพิ่มว่าเพื่อป้องกันไม่ให้เกิดความสับสนในสถานที่แรกที่คุณสามารถพิมพ์:set pasteก่อนวาง หลังจากวางคุณสามารถพิมพ์:set nopasteสิ่งต่างๆเช่น js-beautify และเยื้องเพื่อทำงานอีกครั้ง


1
ฉันใช้:set paste!สำหรับสิ่งนี้ซึ่งสลับค่าการวางแทนการตั้งค่า สิ่งนี้ทำให้ง่ายต่อการปิดเนื่องจากคุณสามารถเลื่อนคำสั่งสองสามคำสั่งแล้วกด Enter
a'r

0

indentของพวกเขาคือเครื่องมือที่เรียกว่า คุณสามารถดาวน์โหลดได้ด้วยแล้วเรียกใช้apt-get install indentindent my_program.c

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.