Đây là một lệnh khác (từ thư viện misc-cmds.el
) thực hiện khá nhiều những gì bạn yêu cầu. Chỉ cần liên kết nó với một khóa duy nhất ( C-M-t
hoặc bất cứ điều gì). Sử dụng nó để di chuyển một sexp cả về phía trước và phía sau nhiều lần.
Một tiền tố phủ định chuyển đổi ngược, giống như transpose-sexp
, nhưng nó cũng để lại điểm sẵn sàng để thực hiện một chuyển vị ngược khác. Và khi lặp lại, một tiền tố phủ định arg chỉ lật hướng.
Vì vậy, nếu bạn liên kết lệnh với, giả sử, C-o
sau đó di chuyển sexp ở bên trái của điểm sang bên phải ba lần, sau đó sang bên trái hai lần, sau đó sang bên phải một lần.C-o C-o C-o
C--
C-o C-o
C--
C-o
Một tiền tố số arg chỉ có tác dụng cho lần sử dụng đầu tiên, nghĩa là, không phải khi lặp lại - khi lặp lại, chuyển động luôn luôn là một sexp mỗi lần.
(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)))
(Lưu ý: Hành vi transpose-sexps
đã thay đổi trong 24.4, do đó kiểm tra phiên bản tại đây. Trước ngày 24.4, điểm kết thúc ở đúng nơi để tiếp tục (ví dụ: lặp lại). Bắt đầu từ 24.4, điểm nằm ở vị trí sai cho điều đó. hồi quy hoặc thêm một tính năng hữu ích hoặc sửa một số lỗi khác có lẽ nằm trong mắt của kẻ si tình. ;-) Tôi đã nộp lỗi Emacs # 20698 cho việc này, ngay bây giờ.)