Aquí hay otro comando (de la biblioteca misc-cmds.el
) que hace más o menos lo que solicitas. Simplemente vincúlelo a una sola tecla ( C-M-t
o lo que sea) Úselo para mover un sexp hacia adelante y hacia atrás repetidamente.
Un prefijo negativo arg se transpone hacia atrás, como transpose-sexp
, pero también deja el punto listo para hacer otra transposición hacia atrás. Y cuando se repite, un prefijo negativo arg simplemente cambia la dirección.
Entonces, si vincula el comando para, digamos, C-o
luego mueve el sexp que está a la izquierda del punto a la derecha tres veces, luego a la izquierda dos veces, luego a la derecha una vez.C-o C-o C-o
C--
C-o C-o
C--
C-o
Un argumento de prefijo numérico tiene un efecto solo para el primer uso, es decir, no cuando se repite; cuando se repite, el movimiento siempre es un sexp a la 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: El comportamiento transpose-sexps
cambió en 24.4, de ahí la prueba de versión aquí. Antes de 24.4, el punto terminó en el lugar correcto para continuar (por ejemplo, repetir). Comenzando con 24.4, el punto está en el lugar equivocado para eso. una regresión o agrega una característica útil o corrige algún otro error presumiblemente está en el ojo del espectador. ;-) Presenté el error Emacs # 20698 para esto, justo ahora).