Sto cercando di creare una funzione che posiziona / allinea / indenta parentesi graffe secondo la formattazione in stile Allman (per la codifica in C).
In generale, sono un fan dell'interfaccia di Smartparens disponibile per gli utenti per la personalizzazione della funzionalità. Ho scritto un sacco di altre funzioni usando l'interfaccia di Smartparens, quindi avrei una forte preferenza a non cambiare pacchetto a questo punto. Detto questo, sono aperto a implementazioni indipendenti dal pacchetto (ad esempio, potrebbe defadvice
essere rilevante qui?).
Sul problema in questione. Qual è l'obiettivo finale? Supponiamo che stiamo codificando e raggiungiamo lo stato rappresentato di seguito. Il simbolo della pipa rappresenta il cursore; Ho digitato l'intestazione della funzione e la parentesi graffa di apertura {
e Smartparens ha aggiunto automaticamente la parentesi graffa di chiusura }
. A questo punto, mi piacerebbe che premendo RET
...
int main {|}
... porta a quanto segue:
int main
{
|
}
Sono stato in grado di scrivere la funzione che risulta in questo comportamento, ma funziona solo per il primo livello di rientro (ad esempio, per la nostra funzione principale nell'esempio sopra). Non riesco a farlo funzionare per i successivi livelli di rientro (vedi GIF):
Il codice pertinente è di seguito. La funzione non è carina ma penso che dovrebbe funzionare ... L'ultima riga è l'interfaccia di Smartparens.
Eventuali suggerimenti?
(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")))