Vim'de C kodunu nasıl otomatik olarak biçimlendirebilir / girintileyebilirim?


250

Başka bir dosyadan kodu kopyaladığımda, biçimlendirme şu şekilde berbat:

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

Bu kodu vim'de nasıl otomatik olarak biçimlendirebilirim?


3
Sadece kodun girintisini değil biçimlendirmek isteyen herkes için, ikinci cevap (benimkini) buna hitap eder. Girintiyi düzeltmek istiyorsanız, kabul edilen cevap en basit yoldur.
Derek

Yanıtlar:


566

Aşağıdaki tuş vuruşlarını deneyin:

gg=G

Açıklama: ggDosyanın en üstüne gider =, girintiyi düzeltmek için kullanılan bir komuttur Gve dosyanın sonuna kadar işlemi gerçekleştirmesini söyler.


28
bu yalnızca kodu girintilendirir. her şeyi AUTOFORMAT için yapılmayan bir şey olabilir mi?
N 1.1

7
Fark ne?
Ton van den Heuvel

3
@Ton van: Fark için cevabımı görün (Burada yorumlarda açıklanamaz).
Lazer

2
-1 Bu, biçimlendirmeyi değil, istenen girintiyi giderir.
oligofren

3
@oligofren OP örneği sadece girinti hatalarını içeriyor ve cevabı kabul ediyor, bu yüzden sanırım demek istediği bu.
Amir Rachum

78

Sanatsal Stil programını kullanmayı seviyorum. Web sitelerine göre :

Sanatsal Stil, C, C ++, C # ve Java programlama dilleri için bir kaynak kodu indenter, formatlayıcı ve güzelleştiricidir.

Windows, Linux ve Mac'te çalışır. Bu gibi (dönüştürme ancak operasyonlar etrafında boşluk koyarak, boşluklar veya tersi ile sekmeleri yerine girinti gibi şeyler yapacağız if(x<2)eğer ( x<2 )fonksiyon tanımları aynı satırda parantez koyarak ya taşımayı nasıl hoşuna eğer yıllardan) Tüm seçenekler komut satırı parametreleri tarafından kontrol edilir.

Vim'de kullanmak için formatprg seçeneğini ona ayarlayın ve sonra gq komutunu kullanın. Yani, örneğin, benim .vimrc içinde var:

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

bir .cpp dosyasını her açışımda formatprg benim sevdiğim seçeneklerle ayarlanır. Sonra, dosyanın en üstüne gitmek gqGve tüm standartları standartlara göre biçimlendirmek için gg yazabilirim . Yalnızca tek bir işlevi yeniden biçimlendirmem gerekirse, işlevin en üstüne gidebilirim, sonra yazabilir gq][ve yalnızca bu işlevi yeniden biçimlendirir.

Astyle için sahip olduğum seçenekler -T4pbsadece benim tercihlerim. Sen üzerinden bakabilirsiniz onların docs ve ancak sizin gibi kod biçimlendirmek için seçenekleri değiştirmek.

İşte bir demo. Astyle'den önce:

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

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

Astyle'den sonra (gggqG):

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

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

Umarım yardımcı olur.


3
Diğer formatlar için böyle bir şey var mı; yakut, xml, json vb.
derGral

1
@Vim-autoformat'ı kontrol edin, aşağıdaki cevaba bakınız. BTW vim-autoformat diğerleri arasında astil de kullanır.
Chiel ten Brinke

1
Teşekkür ederim! Word'de açılış parantezlerini işlev bildirimi ile aynı satırda istemeyen tek kişi olduğumu düşünmeye başlamıştım!
user3640967

27

Kodu düzgün bir şekilde girintilemek için yerleşik komuttan daha önce bahsedilmiştir ( gg=G). Kodu güzelleştirmek istiyorsanız , girinti gibi harici bir uygulama kullanmanız gerekir . Yana %ex modunda geçerli dosya gösterir, bu gibi kullanabilirsiniz:

:!indent %


11

Bunun clang-formatişe yaradığını görüyorum .

Clang belgelerinde bazı örnek tuş bağlantıları vardır

equalprgBağlamayı vim'de kullanmayı tercih ederim . Bu çağırmaya sağlayan clang-formatile G=ggveya başka =girinti seçenekleri.

Aşağıdakileri .vimrc dosyanıza koymanız yeterlidir:

autocmd FileType c,cpp setlocal equalprg=clang-format

3
Önce yüklemeniz gerekiyor, örneğin ubuntu 16.04+ için:sudo apt install clang-format
Eric Wang

3

Belki aşağıdakileri deneyebilirsiniz $ indent -kr -i8 * .c

Umarım sizin için yararlıdır!


3

severim indentYukarıda belirtildiği , ancak çoğunlukla üzerinde çalıştığım dosyanın sadece küçük bir bölümünü biçimlendirmek istiyorum. Yana indentstdin, onun gerçekten basit kod alabilir:

  1. Biçimlendirmek istediğiniz kod bloğunu Vveya benzerini seçin.
  2. Yazarak biçimlendirin :!indent.

astyle stdin de alır, böylece orada aynı hileyi kullanabilirsiniz.


3

Eklemek istedim, :set pasteyapıştırmadan önce yazabileceğiniz ilk etapta karışmasını önlemek için . Yapıştırdıktan sonra :set nopastejs-beautify ve tekrar çalışmaya girintileme gibi şeyler yazabilirsiniz .


1
Bunu yapmak :set paste!için, macun değerini ayarlamak yerine değiştiririm. Bu, birkaç komutu geri kaydırıp enter tuşuna basabileceğiniz için kapanmayı kolaylaştırır.
a'r

0

Onların aracı denir indent. İle indirebilir apt-get install indent, ardından çalıştırabilirsiniz indent my_program.c.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.