Bagaimana saya bisa autoformat / indentasi kode C di vim?

250

Ketika saya menyalin kode dari file lain, pemformatan kacau, seperti ini:

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

Bagaimana saya bisa mengatur otomatis kode ini dalam vim?

Yongwei Xing
sumber
3
Bagi siapa pun yang ingin memformat dan bukan hanya indentasi kode, jawaban kedua (milik saya) mengatasinya. Jika Anda hanya ingin memperbaiki indentasi, jawaban yang diterima adalah cara paling sederhana.
Derek

Jawaban:

566

Coba penekanan tombol berikut:

gg=G

Penjelasan: ggpergi ke bagian atas file, =adalah perintah untuk memperbaiki lekukan dan Gmenyuruhnya untuk melakukan operasi hingga akhir file.

Amir Rachum
sumber
28
ini hanya indentasi kode. dapatkah sesuatu tidak dilakukan untuk MENGOPTIMALKAN semuanya?
N 1.1
7
Apa bedanya?
Ton van den Heuvel
3
@Ton van: Lihat jawaban saya untuk perbedaannya (Tidak bisa dijelaskan di sini dalam komentar).
Lazer
2
-1 Ini hanya memperbaiki indentasi, bukan pemformatan (yang diminta).
oligofren
3
@oligofren Contoh OP hanya menyertakan kesalahan lekukan dan dia menerima jawabannya, jadi saya kira itulah yang dia maksud.
Amir Rachum
78

Saya suka menggunakan program Artistic Style. Menurut situs web mereka :

Gaya Artistik adalah kode sumber indenter, formatter, dan beautifier untuk bahasa pemrograman C, C ++, C # dan Java.

Ini berjalan di Window, Linux dan Mac. Ini akan melakukan hal-hal seperti indentasi, mengganti tab dengan spasi atau sebaliknya, menempatkan ruang di sekitar operasi sesuka Anda (mengkonversi if(x<2)ke jika ( x<2 )jika itu yang Anda suka), meletakkan kawat gigi pada baris yang sama dengan definisi fungsi, atau memindahkannya ke baris di bawah, dll. Semua opsi dikontrol oleh parameter baris perintah.

Untuk menggunakannya dalam vim, cukup atur opsi formatprg ke sana, dan kemudian gunakan perintah gq. Jadi, misalnya, saya miliki di .vimrc saya:

autocmd BufNewFile,BufRead *.cpp set formatprg=astyle\ -T4pb

sehingga setiap kali saya membuka file .cpp, formatprg diatur dengan opsi yang saya suka. Lalu, saya bisa mengetikkan gg untuk pergi ke bagian atas file, dan gqGmemformat seluruh file sesuai dengan standar saya. Jika saya hanya perlu memformat ulang fungsi tunggal, saya bisa pergi ke atas fungsi, lalu ketik gq][dan itu akan memformat ulang fungsi itu saja.

Opsi yang saya miliki untuk astyle,, -T4pbhanyalah preferensi saya. Anda dapat melihat dokumen mereka , dan mengubah opsi untuk memformat kode sesuka Anda.

Ini demo. Sebelum astyle:

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

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

Setelah astyle (gggqG):

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

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

Semoga itu bisa membantu.

Derek
sumber
3
Apakah ada yang seperti ini untuk format lain; ruby, xml, json, dll?
derGral
1
@Ryan periksa vim-autoformat, lihat jawaban di bawah. BTW vim-autoformat juga menggunakan astyle antara lain.
Chiel ten Brinke
1
Terima kasih! Saya mulai berpikir bahwa saya adalah satu-satunya orang di dunia yang tidak ingin tanda kurung dibuka di baris yang sama dengan deklarasi fungsi!
user3640967
27

Perintah builtin untuk indentasi kode dengan benar telah disebutkan ( gg=G). Jika Anda ingin mempercantik kode, Anda harus menggunakan aplikasi eksternal seperti indent . Karena %menunjukkan file saat ini dalam mode ex, Anda dapat menggunakannya seperti ini:

:!indent %
soulmerge
sumber
13

Plugin vim-autoformat memungkinkan Anda memformat buffer Anda (atau pilihan buffer) dengan satu perintah: https://github.com/Chiel92/vim-autoformat . Ini menggunakan program format eksternal untuk itu, dengan fungsi indentasi fallback to vim.

Chiel ten Brinke
sumber
11

Saya menemukan itu clang-formatbekerja dengan baik.

Ada beberapa contoh ikatan kunci dalam dokumentasi dentang

Saya lebih suka menggunakan equalprgbinding di vim. Hal ini memungkinkan Anda untuk memohon clang-formatdengan G=ggatau lainnya =pilihan indent.

Masukkan saja berikut ini di file .vimrc Anda:

autocmd FileType c,cpp setlocal equalprg=clang-format
Daniel
sumber
3
Perlu menginstalnya terlebih dahulu, misalnya untuk ubuntu 16.04+:sudo apt install clang-format
Eric Wang
3

Mungkin Anda bisa mencoba yang berikut ini $ indent -kr -i8 * .c

Semoga bermanfaat bagi Anda!

lattimore
sumber
3

Saya suka indentseperti yang disebutkan di atas, tetapi paling sering saya ingin memformat hanya sebagian kecil dari file yang sedang saya kerjakan. Karena indentdapat mengambil kode dari stdin, ini sangat sederhana:

  1. Pilih blok kode yang ingin Anda format dengan Vatau sejenisnya.
  2. Memformat dengan mengetik :!indent.

astyle Dibutuhkan stdin juga, sehingga Anda dapat menggunakan trik yang sama di sana.

dsummersl
sumber
2

Saya ingin menambahkan, bahwa untuk mencegahnya tidak berantakan, Anda dapat mengetik :set pastesebelum menempel. Setelah menempel, Anda dapat mengetik :set nopasteuntuk hal-hal seperti js-beautify dan indentasi untuk bekerja lagi.

atrip
sumber
1
Saya menggunakan :set paste!ini, yang mengubah nilai tempel alih-alih mengaturnya. Ini membuatnya lebih mudah untuk dimatikan karena Anda dapat dengan mudah menggulir kembali beberapa perintah dan tekan enter.
aēr
0

Mereka adalah alat yang disebut indent. Anda dapat mengunduhnya dengan apt-get install indent, lalu jalankan indent my_program.c.

n0va_sa
sumber