Tôi hiện đang cố gắng tìm hiểu, làm thế nào tôi có thể xử lý một số dòng cụ thể mà không làm hỏng vết lõm của phần còn lại của bộ đệm. Hãy xem xét các chức năng sau đây MyFunc
làm ví dụ:
void MyFunc()
{
unsigned y = 0;
DONOTINDENT;
unsigned int x = 5 + 2;
return x + 12;
}
Ở đây, tôi muốn dòng DONOTINDENT;
được thụt vào cột 0, trong khi phần còn lại của hàm nên được thụt vào bình thường. Tôi đã cố gắng giải quyết điều này bằng cách sử dụng các tùy chỉnh sau c-special-indent-hook
:
(defun my-c-mode-indent-hook ()
(let (p1 p2 myline)
(setq p1 (line-beginning-position))
(setq p2 (line-end-position))
(setq myLine (buffer-substring-no-properties p1 p2))
(if (string-match-p "DONOTINDENT" myLine)
(save-excursion
(indent-line-to 0))
)
)
)
(defun my-c-mode-common-hook ()
;; my customizations for all of c-mode and related modes
(setq c-special-indent-hook 'my-c-mode-indent-hook)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
OK, điều này hoạt động khá tốt cho dòng DONOTINDENT;
, tuy nhiên nó không hoạt động cho tất cả các dòng tiếp theo, vì chúng được thụt lề tương đối DONOTINDENT;
. Vì vậy, nếu DONOTINDENT;
được thụt vào cột 0, unsigned int x = 5 + 2;
cũng sẽ được thụt vào cột 0, nhưng nó phải được thụt vào cột c-basic-offset
.
Làm thế nào tôi có thể sửa chữa vết lõm cho các dòng sau? Có một số biến nội bộ mà tôi có thể sử dụng để ảnh hưởng đến tính toán mức độ thụt lề của các dòng tiếp theo, hoặc tính toán này hoàn toàn dựa trên sự thụt dòng trước đó. Tôi nghĩ rằng, bằng cách nào đó có thể thực hiện được điều này vì các nhãn trong câu lệnh chuyển đổi được thụt vào theo cách tương tự, nhưng tôi đã đấu tranh để tìm ra điều này khi đào sâu vào mã chế độ cc.
Cảm ơn trước!
Trân trọng, Fabian