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")))
Gelöst. Die Abfolge der Cursorbewegungen aus meiner ersten Version (im ursprünglichen Beitrag) war funky.
Als Referenz für zukünftige Leser sollte der folgende Code funktionieren. Es benötigt das Smartparens-Paket (das Sie von git-hub erhalten können). Ich verwende Emacs 24.4. Es funktioniert mit aktiviertem oder deaktiviertem Elektroeinrückungsmodus.
Und irgendwo nach dem Laden des Smartparens-Pakets müssen Sie Folgendes in Ihre Init-Datei aufnehmen:
quelle
previous-line
mitsearch-forward
zu verwenden, um herauszufinden, wo Sie sich befanden, ist es viel besser, sich an Ihre Position in einer Variablen zu erinnern und sie dann einfach zu verwendengoto-char
.save-excursion
, bin mir aber sicher, dass es andere gibt, die ich nicht kenne.Eine andere Möglichkeit besteht darin, eine
smartparens
Einfügungsspezifikation zu verwenden .quelle
Hier ist der Code, den ich verwende, um Ihnen weitere Ideen zur Änderung Ihres Codes zu geben:
Ich bevorzuge den Stil der hängenden Zahnspange, da er Platz spart.
quelle