Вот еще одна команда (из библиотеки misc-cmds.el
), которая в значительной степени выполняет то, что вы запрашиваете. Просто свяжите его с одним ключом ( C-M-t
или чем-то еще). Используйте его для многократного перемещения пола вперед и назад.
Отрицательный префикс arg транспонируется назад, как transpose-sexp
, но он также оставляет точку готовой сделать другую обратную транспозицию. А при повторении отрицательный префикс arg просто меняет направление.
Поэтому, если вы связываете команду, скажем, с C-o
, затем перемещаете сексп, который находится слева от точки, три раза вправо, затем влево дважды, затем один раз вправо.C-o C-o C-o
C--
C-o C-o
C--
C-o
Числовой префикс arg действует только при первом использовании, т. Е. Не при повторении - при повторении движение всегда происходит по одному полу за раз.
(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)))
(Примечание. Поведение transpose-sexps
изменилось в 24.4, отсюда и проверка версии. До 24.4 точка оказалась в правильном месте, чтобы продолжить (например, повторить). Начиная с 24.4, точка находится в неправильном месте для этого. регрессия или добавляет полезную функцию или исправляет некоторые другие ошибки, по-видимому, в глазах смотрящего. ;-) Я подал ошибку Emacs №20698 для этого, только сейчас.)