C ++ 모드, indendation 혼란
오늘 나는 나를 괴롭히는 이상한 것을 깨달았다. 여기 내가 작성한 함수의 작은 예가 있습니다. 나는 아르마딜로를 사용하고 있지만 그것은 중요하지 않습니다. 여기서 들여 쓰기는 괜찮아 보입니다.
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);
}
이제, 이맥스와 같은 열에 플로트 [...]와 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
가 변수로 인식하지 못한 결과라고 생각합니다 . 누구도 이것을 관찰 했습니까?
여기 삽화를위한 스크린 샷
답변
좋아, 그래서 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에 포함되어 수정 설명이 쓸모 없게 될 때까지 오래 걸리지 않을 것이라고 상상할 수 있습니다.