C ++ 모드, indendation 혼란

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

이제 긴 초기화 E2E3성가신 것을 알기 때문에 가독성을 높이기 위해 둘 사이에 줄 바꿈을 만듭니다. 또한 전체 버퍼를 들여 씁니다.

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

이제, 이맥스와 같은 열에 플로트 [...]와 return 문을 들여 쓰기 E2, E3. 첫 번째 예에서는 그렇지 않았습니다. 내 평신도의 마음 속에서 마지막 두 진술 arma::fvec은 첫 번째 예에서와 같이 진술 과 동일한 열에 속합니다 .

이 문제를 해결할 방법이 있습니까?

아직 인터넷에서 구체적인 내용을 찾을 수 없습니다. 보통 저는 c 스타일의 '스트 로스트 럽'을 사용하고 있습니다. 성공하지 못한 다른 스타일을 시도했습니다.

편집 : 죄송합니다. 완전히 잊었습니다. 나는 emacs 25.2.2를 사용하고 있으며, helm을 사용하고 있으며, clang으로 완성 된 회사는 들여 쓰기를 수정할 수 있다고 생각할 수있는 패키지가 없습니다.

Edit2 : -Q 옵션 (emacs -Q)에서도 동일한 동작을 관찰 했으므로 내 패키지가 원인이라는 것을 배제 할 수 있습니다.

Edit3 : 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. 다른 들여 쓰기는 emacs 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 만 있고 progmodes 폴더에 cc- .el 파일이없는 경우 먼저 압축을 풀어야합니다.

$ 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를 다시 시작하십시오.

출력 때문에 ([...] 바이트 컴파일 된 [...]보다 최신). cc 모드에서 emacs에서 버퍼를 열도록 요청 받았습니다.

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

에코 영역에 "t"가 표시되면 모든 것이 정상입니다. 그렇지 않은 경우 백업을 사용하고 초기 상태로 돌아가는 것을 고려할 수 있습니다.

그럼에도 불구하고 제 경우에는 버그가 이렇게 해결되었습니다. 수정이 공식적으로 sourceforge에 포함되어 수정 설명이 쓸모 없게 될 때까지 오래 걸리지 않을 것이라고 상상할 수 있습니다.