Ich versuche, eine Funktion zu erstellen, die geschweifte Klammern gemäß der Allman-Formatierung (zum Codieren in C) platziert / ausrichtet / einrückt.
Im Allgemeinen bin ich ein Fan der Smartparens-Benutzeroberfläche, die Benutzern zum Anpassen von Funktionen zur Verfügung steht. Ich habe eine Reihe anderer Funktionen über die Smartparens-Oberfläche geschrieben, daher würde ich es vorziehen, an dieser Stelle keine Pakete zu wechseln. Trotzdem bin ich offen für paketunabhängige Implementierungen (z. B. könnte defadvice
dies hier relevant sein?).
Weiter zum Problem. Was ist das Endziel? Nehmen wir an, wir codieren und erreichen den unten dargestellten Status. Das Pipe-Symbol steht für den Cursor. Ich habe den Funktionskopf und die öffnende Klammer {
eingegeben, und Smartparens hat die schließende Klammer automatisch hinzugefügt }
. An dieser Stelle möchte ich, dass das Drücken RET
...
int main {|}
... führt zu Folgendem:
int main
{
|
}
Ich konnte die Funktion schreiben, die zu diesem Verhalten führt, aber sie funktioniert nur für die erste Einrückungsstufe (z. B. für unsere Hauptfunktion im obigen Beispiel). Ich kann es nicht für nachfolgende Einrückungsstufen zum Laufen bringen (siehe GIF):
Der entsprechende Code ist unten. Die Funktion ist nicht schön, aber ich denke, sie sollte funktionieren ... Die allerletzte Zeile ist die Schnittstelle zu Smartparens.
Irgendwelche Vorschläge?
(defun my-create-newline-and-enter-sexp (&rest _ignored)
"Open a new brace or bracket expression, with relevant newlines and indent. "
(interactive)
(progn
(backward-char 2) (newline) (forward-char) (newline)
(indent-according-to-mode)
(previous-line 2) (indent-according-to-mode)
(next-line) (next-line) (indent-according-to-mode)))
(sp-local-pair 'c-mode "{" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))