Estou tentando criar uma função que coloca / alinha / recua colchetes de acordo com a formatação no estilo Allman (para codificação em C).
De um modo geral, sou fã da interface do Smartparens disponível para os usuários para personalizar a funcionalidade. Eu escrevi várias outras funções usando a interface Smartparens, por isso teria uma forte preferência de não alternar pacotes neste momento. Dito isto, estou aberto a implementações independentes de pacote (por exemplo, podem defadvice
ser relevantes aqui?).
Para o problema em questão. Qual é o objetivo final? Vamos supor que estamos codificando e atingimos o estado representado abaixo. O símbolo de barra vertical representa o cursor; Eu digitei o cabeçalho da função e a chave de abertura {
, e a Smartparens adicionou automaticamente a chave de fechamento }
. Neste ponto, eu gostaria que pressionando RET
...
int main {|}
... leva ao seguinte:
int main
{
|
}
Consegui escrever a função que resulta nesse comportamento, mas ela funciona apenas para o primeiro nível de indentação (por exemplo, para nossa função principal no exemplo acima). Não consigo fazê-lo funcionar em níveis subsequentes de recuo (veja gif):
O código relevante está abaixo. A função não é bonita, mas acho que deve funcionar ... A última linha é a interface do Smartparens.
Alguma sugestão?
(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")))