J'essaie de créer une fonction qui place / aligne / indente les accolades selon le formatage de style Allman (pour le codage en C).
De manière générale, je suis fan de l'interface de Smartparens à la disposition des utilisateurs pour la personnalisation des fonctionnalités. J'ai écrit un tas d'autres fonctions en utilisant l'interface Smartparens, donc je préférerais fortement ne pas changer de paquet à ce stade. Cela dit, je suis ouvert aux implémentations indépendantes des packages (par exemple, pourraient defadvice
être pertinentes ici?).
Passons au problème en cours. Quel est l'objectif final? Supposons que nous codons et que nous atteignons l'état représenté ci-dessous. Le symbole de tuyau représente le curseur; J'ai tapé l'en-tête de fonction et l'accolade ouvrante {
, et Smartparens a automatiquement ajouté l'accolade fermante }
. À ce stade, je voudrais que presser RET
...
int main {|}
... conduit à ce qui suit:
int main
{
|
}
J'ai pu écrire la fonction qui se traduit par ce comportement mais cela ne fonctionne que pour le premier niveau d'indentation (par exemple, pour notre fonction principale dans l'exemple ci-dessus). Je ne peux pas le faire fonctionner pour les niveaux d'indentation suivants (voir gif):
Le code correspondant est ci-dessous. La fonction n'est pas jolie mais je pense qu'elle devrait fonctionner ... La toute dernière ligne est l'interface avec Smartparens.
Aucune suggestion?
(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")))