Ich versuche derzeit herauszufinden, wie ich einige Zeilen gezielt behandeln kann, ohne die Einrückung des restlichen Puffers zu verfälschen. Betrachten Sie die folgende Funktion MyFunc
als Beispiel:
void MyFunc()
{
unsigned y = 0;
DONOTINDENT;
unsigned int x = 5 + 2;
return x + 12;
}
Hier möchte ich, dass die Zeile DONOTINDENT;
in Spalte 0 eingerückt wird, während der Rest der Funktion normal eingerückt werden soll. Ich habe versucht, dies mit dem folgenden Brauch zu lösen 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, dies funktioniert für die Zeile recht gut DONOTINDENT;
, funktioniert jedoch nicht für alle nachfolgenden Zeilen, da diese relativ zu eingerückt sind DONOTINDENT;
. Wenn DONOTINDENT;
also in Spalte 0 eingerückt ist, unsigned int x = 5 + 2;
wird auch in Spalte 0 eingerückt, aber es sollte in Spalte eingerückt werden c-basic-offset
.
Wie kann ich den Einzug für die folgenden Zeilen korrigieren? Gibt es eine interne Variable, mit der ich die Berechnung der Einrückungsstufe der nachfolgenden Zeilen beeinflussen kann, oder basiert diese Berechnung ausschließlich auf der vorhergehenden Einrückung. Ich denke, es sollte möglich sein, dies irgendwie zu erreichen, da Beschriftungen in switch-case-Anweisungen auf ähnliche Weise eingerückt werden, aber ich hatte Mühe, dies herauszufinden, als ich mich in den cc-mode-Code vertiefte.
Danke im Voraus!
Viele Grüße, Fabian
quelle