C ++ modu, indendasyon karışıklığı

Aug 16 2020

Bugün beni rahatsız eden tuhaf bir şeyin farkına vardım. İşte yazdığım bir fonksiyonun küçük bir örneği. Armadillo kullanıyorum ama bu önemsiz. Burada girinti gayet iyi görünüyor.

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z}, E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};
    
    float cosPhi2 = norm_dot(E2,E3);
    
    return Kurfess_Eq5(cosPhi2);
}

Şimdi, uzun başlatmayı E2ve E3can sıkıcı buluyorum , bu yüzden daha iyi okunabilirlik için ikisi arasında bir satır sonu yapıyorum. Ayrıca tüm tamponumu girintili yaptım.

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

        float cosPhi2 = norm_dot(E2,E3);

        return Kurfess_Eq5(cosPhi2);
}

Şimdi, Emacs ile aynı kolona şamandıra [...] ve geri dönüş deyimi girintiler E2, E3. İlk örnekte durum böyle değildi. Benim meslekten olmayan kişinin zihninde, son iki ifade arma::fvec, ilk örnekte olduğu gibi, ifade ile aynı sütuna aittir .

Bunu düzeltmenin bir yolu var mı?

İnternette henüz belirli bir şey bulamadım. Genellikle c tarzı 'stroustrup' kullanıyorum. Başarısız başka stilleri denedim.

Düzenleme: Üzgünüm, tamamen unuttum. Emacs 25.2.2 kullanıyorum, dümen kullanıyorum ve clang ile tamamlanmış bir şirket ama aklıma gelen hiçbir paket girintileri değiştirmiyor.

Düzenleme2: Aynı davranışı -Q seçeneği (emacs -Q) ile de gözlemledim, bu nedenle sanırım paketlerimin nedensellik olduğunu ekarte edebilirim.

Düzenleme3: emacs 27.1'in yüklenmesi sorunu çözdü, ancak bu beni vurgulama ve girinti ile ilgili bir takip sorusuna yönlendirdi.

Örnek 3: Şimdi, girinti doğru görünüyor, ancak vurgulama kapalı (önceden öyleydi, ancak girinti sorunu öncelikliydi).

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec
        E2 {vertex2X - vertex1X, vertex2Y - vertex1Y, vertex2Z - vertex1Z},
        E3 {vertex3X - vertex2X, vertex3Y - vertex2Y, vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

Yukarıdaki örnekte, Emacs E2bir değişken olarak vurgulanır , ancak E3standart metin rengidir. Şimdi girintiyi Örnek4 olarak değiştirdiğimde:

float GetE0()
{
    // Calculate E0 according to Kurfess et. al, 2000
    arma::fvec

         E2 {vertex2X - vertex1X,
         vertex2Y - vertex1Y,
         vertex2Z - vertex1Z},

         E3 {vertex3X - vertex2X,
             vertex3Y - vertex2Y,
             vertex3Z - vertex2Z};

    float cosPhi2 = norm_dot(E2,E3);
    return Kurfess_Eq5(cosPhi2);
}

Girintisinin E2farklı olduğunu görebilirsiniz E3. Farklı girintilerin, emac'lerin E3değişken olarak tanınmamasının bir sonucu olduğuna inanıyorum . Bunu da gören oldu mu?

İşte örnek için bir ekran görüntüsü

Yanıtlar

Andi Aug 31 2020 at 01:08

Tamam, bu yüzden CC-Mode'un geliştiricileri / geliştiricileri ile temasa geçtim ve bunun bir hata olduğu ortaya çıktı. Bununla da ilgilendiler:https://sourceforge.net/p/cc-mode/mailman/message/37097087/

Yazışmada metin biçiminde bir yama bulursunuz. Yamayı uygulamak için metni bir dosyaya kopyalayın, örneğin patchfile.txt

$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes

Yalnızca cc - *. El.gz ve .elc varsa, ancak progmodes klasöründe cc- .el dosyanız yoksa, önce bunları çıkarmanız gerekir

$ gunzip cc-*.el

Yamayı uygulamadan önce herhangi bir hata olup olmadığını kontrol edin

$ patch --dry-run < patchfile.txt

Çıktı şuna benziyorsa:

Hunk #1 succeeded at 9091 (offset -22 lines).
Hunk #2 succeeded at 9144 (offset -22 lines).
Hunk #3 succeeded at 11731 (offset -29 lines).
checking file cc-langs.el
Hunk #1 succeeded at 3684 (offset -9 lines).

Şimdi yamayı uygulayabilirsiniz

$ patch < patchfile.txt
[same output as dry-run]

Yama uygularken, geri dönmeniz gerekmesi ihtimaline karşı .orig dosyaları yedek olarak oluşturulur.

Son adım olarak, .el dosyalarını .elc olarak derlemeniz gerekecek

$ emacs -Q -batch -f batch-byte-compile cc-*.el

Çıktım:

Source file ‘/opt/emacs/emacs-27.1-install/share/emacs/27.1/lisp/progmodes/cc-langs.el’ newer than byte-compiled file; using older file

In end of data:
cc-styles.el:687:1:Warning: the function ‘c-guess-basic-syntax’ might not be
    defined at runtime.

Şimdi emacs'i yeniden başlatın.

Çıktı nedeniyle ([...] bayt-derlenmiş [...] 'den daha yeni). Cc modunda emacs'de bir arabellek açmam istendi, yazın

M-: c-recognize-bare-brace-inits
<Return>

Eko alanı "t" gösteriyorsa, her şey yolunda olmalıdır. Değilse, yedeklemeyi kullanmayı ve başlangıç ​​durumuna dönmeyi düşünebilirsiniz.

Yine de, benim durumumda hata bu şekilde çözüldü. Düzeltmenin resmi olarak sourceforge'da olması uzun sürmeyeceğini tahmin edebiliyorum, bu da bu düzeltme açıklamasını geçersiz kılacak.