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")))
fonte
Resolvido. A sequência de movimentos do cursor da minha primeira versão (na postagem original) foi descolada.
Como referência para futuros leitores, o código a seguir deve funcionar. Obv precisa do pacote Smartparens (que você pode obter no git-hub). Estou executando o Emacs 24.4. Funciona com o modo de indentação elétrica ativado ou desativado.
E você precisará incluir também o seguinte no seu arquivo init, em algum lugar após o carregamento do pacote Smartparens:
fonte
previous-line
comsearch-forward
para tentar descobrir novamente onde você estava, é muito melhor lembrar sua posição em uma variável e depois apenas usargoto-char
.save-excursion
mas tenho certeza de que existem outras que não conheço.Outra maneira, mais tersa, é usar uma
smartparens
especificação de inserção .fonte
Aqui está o código que eu uso, apenas para lhe dar mais idéias para alterar seu código:
Eu prefiro o estilo de suspensórios, pois economiza espaço.
fonte