โหมด C ++ ความสับสนในการเยื้อง

Aug 16 2020

วันนี้ฉันรู้ว่ามีบางอย่างแปลก ๆ ที่รบกวนฉัน นี่คือตัวอย่างเล็กน้อยของฟังก์ชันที่ฉันเขียน ฉันกำลังใช้ตัวนิ่ม แต่นั่นไม่สำคัญ ที่นี่การเยื้องดูดี

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);
}

ตอนนี้ฉันพบการเริ่มต้นที่ยาวนานE2และE3น่ารำคาญดังนั้นฉันจึงแบ่งบรรทัดระหว่างทั้งสองเพื่อให้อ่านง่ายขึ้น ฉันยังเยื้องบัฟเฟอร์ทั้งหมดของฉันด้วย

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);
}

ตอนนี้ Emacs เยื้องลอย [... ] และส่งคืนคำสั่งไปยังคอลัมน์เดียวกับE2, E3. นี่ไม่ใช่กรณีในตัวอย่างแรก ในความคิดของคนธรรมดาของฉันข้อความสองประโยคสุดท้ายเป็นของคอลัมน์เดียวกับarma::fvecคำสั่งเหมือนในตัวอย่างแรก

มีวิธีแก้ไขปัญหานี้หรือไม่?

ฉันยังไม่พบสิ่งที่เฉพาะเจาะจงในอินเทอร์เน็ต โดยปกติฉันใช้ c-style 'stroustrup' ฉันลองรูปแบบอื่น ๆ โดยไม่ประสบความสำเร็จ

แก้ไข:ขออภัยฉันลืมไปแล้ว ฉันใช้ emacs 25.2.2 ฉันใช้หางเสือและ บริษัท ที่สมบูรณ์แบบด้วยเสียงดัง แต่ไม่มีแพ็คเกจที่ฉันคิดว่าจะแก้ไขการเยื้องได้

แก้ไข 2:ฉันยังสังเกตพฤติกรรมเดียวกันกับตัวเลือก -Q (emacs -Q) ดังนั้นฉันเดาว่าฉันสามารถแยกแยะได้ว่าแพ็คเกจของฉันเป็นสาเหตุ

แก้ไข 3:การติดตั้ง emacs 27.1 แก้ไขปัญหาได้ แต่สิ่งนี้ทำให้ฉันมีคำถามติดตามเกี่ยวกับการไฮไลต์และการเยื้อง

ตัวอย่างที่ 3: ตอนนี้การเยื้องดูเหมือนจะถูกต้อง แต่การไฮไลต์ปิดอยู่ (ก่อนหน้านี้ แต่ปัญหาการเยื้องมีลำดับความสำคัญ)

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);
}

ในตัวอย่างข้างต้น Emacs จะไฮไลต์E2เป็นตัวแปร แต่E3เป็นสีข้อความมาตรฐาน ตอนนี้ฉันเปลี่ยนการเยื้องเป็น 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);
}

คุณสามารถมองเห็นว่าการเยื้องของความแตกต่างจากE2 E3ฉันเชื่อว่าการเยื้องที่แตกต่างกันเป็นผลมาจาก emac ที่ไม่รู้จักE3ว่าเป็นตัวแปร มีใครสังเกตเรื่องนี้บ้างไหม?

นี่คือภาพหน้าจอสำหรับภาพประกอบ

คำตอบ

Andi Aug 31 2020 at 01:08

โอเคฉันจึงติดต่อกับผู้ดูแล / ผู้พัฒนา CC-Mode และปรากฎว่านี่เป็นข้อบกพร่อง พวกเขาดูแลมันด้วย:https://sourceforge.net/p/cc-mode/mailman/message/37097087/

ในการติดต่อคุณจะพบแพทช์ในรูปแบบข้อความ ในการใช้โปรแกรมแก้ไขให้คัดลอกข้อความไปยังไฟล์เช่น patchfile.txt

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

ถ้าคุณมีแค่ cc - *. el.gz และ. elc แต่ไม่มีไฟล์cc- .el ในโฟลเดอร์ progmodes คุณจะต้องแตกไฟล์ออกก่อน

$ gunzip cc-*.el

ก่อนที่จะใช้โปรแกรมแก้ไขตรวจสอบว่าจะมีข้อผิดพลาดหรือไม่

$ patch --dry-run < patchfile.txt

หากผลลัพธ์มีลักษณะคล้ายกับสิ่งนี้:

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).

ตอนนี้คุณสามารถใช้โปรแกรมแก้ไขได้แล้ว

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

ในขณะทำการแพตช์ไฟล์. orig จะถูกสร้างขึ้นเพื่อเป็นข้อมูลสำรองในกรณีที่คุณจำเป็นต้องย้อนกลับ

ในขั้นตอนสุดท้ายคุณจะต้องคอมไพล์ไฟล์. el เป็น. elc

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

ผลลัพธ์ของฉัน:

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.

ตอนนี้รีสตาร์ท emacs

เนื่องจากเอาต์พุต ([... ] ใหม่กว่าไบต์คอมไพล์ [... ]) ฉันถูกขอให้เปิดบัฟเฟอร์ใน emacs ในโหมด cc พิมพ์

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

หากพื้นที่เสียงสะท้อนแสดง "t" ทุกอย่างก็ควรจะเรียบร้อย หากไม่เป็นเช่นนั้นคุณอาจพิจารณาใช้การสำรองข้อมูลและกลับสู่สถานะเริ่มต้น

อย่างไรก็ตามในกรณีของฉันข้อบกพร่องได้รับการแก้ไขด้วยวิธีนี้ ฉันนึกภาพออกว่าจะใช้เวลาไม่นานจนกว่าการแก้ไขจะเป็นทางการใน sourceforge ซึ่งจะทำให้คำอธิบายการแก้ไขนี้ล้าสมัย