Ось ще одна команда (з бібліотеки misc-cmds.el
), яка робить майже все, що вам потрібно. Просто прив’яжіть його до однієї клавіші ( C-M-t
або будь-якої іншої ). Використовуйте його для переміщення секса як вперед, так і назад кілька разів.
Негативний аргумент префікса переміщує назад, як transpose-sexp
, але він також залишає точку готовою зробити ще одну зворотну транспозицію. А при повторенні негативний аргумент з префіксом просто перевертає напрямок.
Так що, якщо ви зв'яжете команду, скажімо, C-o
, потім переміщує Sexp , що знаходиться зліва від точки до правої три рази, потім двічі вліво, потім вправо один раз.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 для цього, просто зараз.)