Eu tenho usado a Edição Estrutural do cursive (um modo pareditado para Intellij e Cursive) e encontrei um bom comando lá chamado move form-up (e para baixo).
Mover formulário para cima faz isso (este |
é o ponto):
(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)
e Mover formulário para baixo é análogo:
(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))
É possível fazer isso no modo paredit do Emacs? Eu acho que não está no conjunto de parênteses básico (pelo menos não está descrito nesta folha de dicas)
C-M-t
faz a mesma coisa. Mas acho que o que você quer dizer é que a mesma forma continua sendo movida, em vez de trocar o progresso pelo próximo par de sexps.Respostas:
Como o @Drew sugeriu,
C-M-t
faz o que você quer. A regra é assim:C-M-t
(que é executadotranspose-sexp
).Ou, você pode simplesmente pensar que isso não é transposição, mas simplesmente para avançar, você precisa colocar um ponto após o sexp que deseja mover.
No entanto, existe um conveniente: quando você deseja transpor o sexp esquerdo para trás, você usa o mesmo,
C-M-t
mas é fornecido com um argumento de prefixo negativo e isso é inconveniente. Outra questão é que esse ponto não segue o sexp esquerdo transposto para trás . Para resolver esse problema, criamos uma versão reversa detranspose-sexps
:Em seguida, vincule-o ao
C-M-y
que está ao ladoC-M-t
e é livre no Emacs padrão.Aqui está uma demonstração; você notará que
(MY-SEXP1)
está à esquerda o tempo todo para avançar / retroceder:fonte
É possível fazer isso com lispy , que é uma forma avançada de
paredit-mode
.Para o seu caso de uso:
A única coisa é que o cursor precisa estar em paren, como está no seu exemplo:
Você também pode mover vários sexps de uma só vez com we s, se os marcar com uma região. Veja a documentação para mais informações.
fonte
Aqui está outro comando (da biblioteca
misc-cmds.el
) que faz praticamente o que você solicita. Basta vinculá-lo a uma única chave (C-M-t
ou qualquer outra coisa). Use-o para mover um sexp para frente e para trás repetidamente.Um prefixo negativo arg transpõe para trás, como
transpose-sexp
, mas também deixa point pronto para fazer outra transposição para trás. E ao repetir, um prefixo negativo arg apenas inverte a direção.Então, se você ligar o comando para, digamos,
C-o
e, em seguida move o sexp que está à esquerda do ponto à direita três vezes, em seguida, para a esquerda duas vezes, depois para a direita uma vez.C-o C-o C-o
C--
C-o C-o
C--
C-o
Um prefixo numérico arg tem efeito apenas no primeiro uso, ou seja, não ao repetir - ao repetir, o movimento é sempre um sexp por vez.
(Nota: O comportamento de
transpose-sexps
mudou em 24.4, daí o teste de versão aqui. Antes de 24.4, o ponto acabou no lugar certo para continuar (por exemplo, repita). Começando com 24.4, o ponto está no lugar errado para isso. uma regressão ou adiciona um recurso útil ou corrige algum outro bug provavelmente está nos olhos de quem vê. ;-) Arquivei o bug # 20698 do Emacs para isso, agora.)fonte