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.
(defun reversible-transpose-sexps (arg)
"Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
1. Leaves point after the moved sexp.
2. When repeated, a negative prefix arg flips the direction."
(interactive "p")
(when (eq last-command 'rev-transp-sexps-back) (setq arg (- arg)))
(transpose-sexps arg)
(unless (natnump arg)
(when (or (> emacs-major-version 24)
(and (= emacs-major-version 24) (> emacs-minor-version 3)))
(backward-sexp (abs arg)) (skip-syntax-backward " ."))
(setq this-command 'rev-transp-sexps-back)))
(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.)