Chế độ C ++, nhầm lẫn thời hạn
Hôm nay tôi nhận ra một điều kỳ lạ làm phiền tôi. Đây là một ví dụ nhỏ về một hàm tôi đã viết. Tôi đang sử dụng armadillo, nhưng điều đó không quan trọng. Ở đây, vết lõm trông rất ổn.
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);
}
Bây giờ, tôi thấy quá trình khởi tạo dài E2
và E3
gây khó chịu, vì vậy tôi tạo dấu ngắt dòng giữa cả hai để dễ đọc hơn. Tôi cũng thụt lề toàn bộ bộ đệm của mình.
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);
}
Bây giờ, Emacs Canh lề các float [...] và tuyên bố quay trở lại cùng một cột như E2
, E3
. Đây không phải là trường hợp trong ví dụ đầu tiên. Trong tâm trí giáo dân của tôi, hai câu lệnh cuối cùng thuộc cùng một cột với arma::fvec
câu lệnh, giống như trong ví dụ đầu tiên.
Có cách nào để sửa lỗi này?
Tôi không thể tìm thấy bất cứ điều gì cụ thể trên internet. Thông thường, tôi đang sử dụng c-style 'stroustrup'. Tôi đã thử các phong cách khác mà không thành công.
Chỉnh sửa: Xin lỗi, tôi hoàn toàn quên mất. Tôi đang sử dụng emacs 25.2.2, tôi sử dụng helm và một công ty hoàn chỉnh với clang nhưng không có gói nào mà tôi có thể nghĩ ra để sửa đổi các thụt đầu dòng.
Chỉnh sửa2: Tôi cũng quan sát thấy hành vi tương tự với tùy chọn -Q (emacs -Q), do đó tôi đoán tôi có thể loại trừ rằng các gói của tôi là nguyên nhân.
Chỉnh sửa3: Cài đặt emacs 27.1 đã khắc phục sự cố nhưng điều này dẫn tôi đến một câu hỏi tiếp theo liên quan đến tô sáng và thụt lề.
Ví dụ 3: Bây giờ, thụt lề có vẻ đúng nhưng đánh dấu bị tắt (trước đây là vậy, nhưng vấn đề thụt lề được ưu tiên).
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);
}
Trong ví dụ trên, Emacs làm nổi bật E2
như một biến nhưng E3
là màu văn bản tiêu chuẩn. Khi bây giờ tôi thay đổi thụt lề thành Ví dụ 4:
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);
}
Bạn có thể thấy, thụt lề của E2
khác với E3
. Tôi tin rằng sự thụt lề khác nhau là kết quả của việc emacs không nhận dạng được E3
là một biến. Có ai cũng quan sát điều này?
Đây là một ảnh chụp màn hình để minh họa

Trả lời
Được rồi, vì vậy tôi đã liên hệ với những người bảo trì / phát triển CC-Mode và hóa ra đây là lỗi. Họ cũng đã chăm sóc nó:https://sourceforge.net/p/cc-mode/mailman/message/37097087/
Trong thư từ, bạn tìm thấy một bản vá ở dạng văn bản. Để áp dụng bản vá, hãy sao chép văn bản vào một tệp, ví dụ: patchfile.txt
$ mv patchfile.txt path/to/emacs/share/../lisp/progmodes $ cd path/to/emacs/share/../lisp/progmodes
Nếu bạn chỉ có cc - *. El.gz và .elc nhưng không có tệp cc- .el trong thư mục progmodes, trước tiên bạn sẽ phải giải nén chúng
$ gunzip cc-*.el
Trước khi áp dụng bản vá, hãy kiểm tra xem có bất kỳ lỗi nào không
$ patch --dry-run < patchfile.txt
Nếu đầu ra trông giống như sau:
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).
Bây giờ bạn có thể áp dụng bản vá
$ patch < patchfile.txt
[same output as dry-run]
Trong khi vá, các tệp .orig được tạo như một bản sao lưu, phòng trường hợp bạn cần quay lại.
Bước cuối cùng, bạn sẽ phải biên dịch tệp .el thành .elc
$ emacs -Q -batch -f batch-byte-compile cc-*.el
Đầu ra của tôi:
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.
Bây giờ khởi động lại emacs.
Vì đầu ra ([...] mới hơn [...] được biên dịch theo byte). Tôi được yêu cầu mở bộ đệm trong emacs ở chế độ cc, nhập
M-: c-recognize-bare-brace-inits
<Return>
Nếu vùng tiếng vọng hiển thị "t" thì mọi thứ sẽ ổn. Nếu không, bạn có thể cân nhắc sử dụng bản sao lưu và quay lại trạng thái ban đầu.
Tuy nhiên, trong trường hợp của tôi, lỗi đã được giải quyết theo cách này. Tôi có thể tưởng tượng rằng sẽ không mất nhiều thời gian cho đến khi bản sửa lỗi cũng chính thức có trên sourceforge, điều này sẽ làm cho mô tả sửa chữa này trở nên lỗi thời.