Voici une autre commande (de la bibliothèque misc-cmds.el
) qui fait à peu près ce que vous demandez. Il suffit de le lier à une seule clé ( C-M-t
ou autre). Utilisez-le pour déplacer un sexe à la fois vers l'avant et vers l'arrière à plusieurs reprises.
Un préfixe négatif arg transpose vers l'arrière, comme transpose-sexp
, mais il laisse également le point prêt à effectuer une autre transposition vers l'arrière. Et lors de la répétition, un préfixe négatif arg inverse simplement la direction.
Donc, si vous liez la commande à, disons, déplacez C-o
ensuite le sexp qui est à gauche du point vers la droite trois fois, puis deux fois vers la gauche, puis une fois vers la droite.C-o C-o C-o
C--
C-o C-o
C--
C-o
Un préfixe numérique arg n'a d'effet que pour la première utilisation, c'est-à-dire pas lors de la répétition - lors de la répétition, le mouvement est toujours un sexp à la fois.
(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)))
(Remarque: Le comportement de transpose-sexps
changé en 24.4, d'où le test de version ici. Avant 24.4, le point s'est retrouvé au bon endroit pour continuer (par exemple, répéter). À partir de 24.4, le point est au mauvais endroit pour cela. Que ce soit une régression ou ajoute une fonctionnalité utile ou corrige un autre bogue est probablement dans l'œil du spectateur. ;-) J'ai déposé le bogue Emacs # 20698 pour cela, tout à l'heure.)