Mode C ++, kebingungan indendasi
Hari ini saya menyadari sesuatu yang aneh yang mengganggu saya. Berikut adalah contoh kecil dari fungsi yang saya tulis. Saya menggunakan armadillo, tapi itu tidak penting. Di sini, lekukannya terlihat bagus.
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);
}
Sekarang, saya menemukan inisialisasi yang panjang E2
dan E3
menjengkelkan, jadi saya membuat pemutusan baris di antara keduanya agar dapat diperbaiki dengan lebih baik. Saya juga mengindentasi seluruh buffer saya.
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);
}
Sekarang, Emacs indentasi float [...] dan pernyataan kembali ke kolom yang sama seperti E2
, E3
. Ini tidak terjadi pada contoh pertama. Dalam pikiran awam saya, dua pernyataan terakhir termasuk dalam kolom yang sama dengan arma::fvec
pernyataan itu, seperti di contoh pertama.
Apakah ada cara untuk memperbaikinya?
Saya belum bisa temukan yang spesifik di internet. Biasanya, saya menggunakan 'stroustrup' gaya-c. Saya mencoba gaya lain tetapi tidak berhasil.
Edit: Maaf, saya benar-benar lupa. Saya menggunakan emacs 25.2.2, saya menggunakan helm, dan perusahaan lengkap dengan dentang tetapi tidak ada paket yang saya pikir dapat memodifikasi lekukan.
Sunting2: Saya juga mengamati perilaku yang sama dengan opsi -Q (emacs -Q), oleh karena itu saya rasa saya dapat mengesampingkan bahwa paket saya adalah penyebabnya.
Edit3: Menginstal emacs 27.1 memperbaiki masalah tetapi ini membawa saya ke pertanyaan lanjutan tentang penyorotan dan indentasi.
Contoh 3: Sekarang, indentasi tampaknya benar tetapi sorotan mati (sebelumnya, tetapi masalah indentasi adalah prioritas).
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);
}
Dalam contoh di atas, Emacs disorot E2
sebagai variabel tetapi E3
merupakan warna teks standar. Saat saya sekarang mengubah indentasi menjadi Example4:
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);
}
Anda dapat melihat, bahwa lekukan E2
berbeda dari E3
. Saya yakin perbedaan indentasi adalah hasil dari emacs yang tidak dikenali E3
sebagai variabel. Apakah ada yang juga mengamati ini?
Berikut tangkapan layar untuk ilustrasi

Jawaban
Oke, jadi saya menghubungi pengelola / pengembang CC-Mode dan ternyata ini bug. Mereka juga merawatnya:https://sourceforge.net/p/cc-mode/mailman/message/37097087/
Dalam korespondensi Anda menemukan tambalan dalam bentuk teks. Untuk menerapkan patch, salin teks ke file misalnya patchfile.txt
$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes
Jika Anda hanya memiliki cc - *. El.gz dan .elc tetapi tidak ada file cc- .el di folder progmodes, Anda harus mengekstraknya terlebih dahulu
$ gunzip cc-*.el
Sebelum menerapkan tambalan, periksa apakah ada kesalahan
$ patch --dry-run < patchfile.txt
Jika hasilnya terlihat seperti ini:
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).
Anda sekarang dapat menerapkan tambalan
$ patch < patchfile.txt
[same output as dry-run]
Saat menambal, file .orig dibuat sebagai cadangan, jika Anda perlu kembali.
Sebagai langkah terakhir, Anda harus mengkompilasi file .el ke .elc
$ emacs -Q -batch -f batch-byte-compile cc-*.el
Keluaran saya:
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.
Sekarang mulai ulang emacs.
Karena keluaran ([...] lebih baru dari byte-compiled [...]). Saya diminta untuk membuka buffer di emacs dalam mode cc, ketik
M-: c-recognize-bare-brace-inits
<Return>
Jika area gema menampilkan "t", semuanya akan baik-baik saja. Jika tidak, Anda dapat mempertimbangkan untuk menggunakan cadangan dan kembali ke keadaan awal.
Meskipun demikian, dalam kasus saya, bug diselesaikan dengan cara ini. Saya bisa membayangkan bahwa tidak akan butuh waktu lama sampai perbaikan juga secara resmi di sourceforge yang akan membuat deskripsi perbaikan ini usang.