drag-stuff
Kiểm tra drag-stuff
gói (cũng có sẵn trên Melpa).
Sau đó, bạn có thể chọn một khu vực và sử dụng drag-stuff-up
/ drag-stuff-down
để di chuyển khu vực đó lên / xuống.
Hành vi thay thế khi kéo dòng
Theo mặc định, các drag-stuff
lệnh cũng sẽ kéo dòng point
đang bật (ngay cả khi điểm nằm trên cột đầu tiên). Nếu bạn muốn chọn, hãy nói toàn bộ 2 dòng bằng cách thực hiện C-a C-SPC C-n C-n
, lựa chọn sẽ trông giống như thế này
line 1
▯line 2
line 3
▮line 4
line 5
Lưu ý rằng ở đây tôi dự định chỉ di chuyển dòng 2 và 3, không phải dòng 4 . Nhưng drag-stuff
theo mặc định sẽ di chuyển dòng thứ 3 đó.
Đó là peeve pet của tôi (và có lẽ không áp dụng cho bất kỳ ai khác) và vì vậy tôi đã yêu cầu nhà phát triển gói giải pháp . Đây là một hack bạn có thể đặt cấu hình emacs của mình sau khi yêu cầu drag-stuff
nếu bạn không muốn hành vi mặc định này. Việc hack sẽ không di chuyển dòng hiện tại NẾU điểm nằm trên cột 0 (cột đầu tiên).
;; https://github.com/kaushalmodi/.emacs.d/blob/master/setup-files/setup-drag-stuff.el
;; https://github.com/rejeep/drag-stuff.el/issues/4
(defvar modi/drag-stuff--point-adjusted nil)
(defvar modi/drag-stuff--point-mark-exchanged nil)
(defun modi/drag-stuff--adj-pt-pre-drag ()
"If a region is selected AND the `point' is in the first column, move
back the point by one char so that it ends up on the previous line. If the
point is above the mark, exchange the point and mark temporarily."
(when (region-active-p)
(when (< (point) (mark)) ; selection is done starting from bottom to up
(exchange-point-and-mark)
(setq modi/drag-stuff--point-mark-exchanged t))
(if (zerop (current-column))
(progn
(backward-char 1)
(setq modi/drag-stuff--point-adjusted t))
;; If point did not end up being on the first column after the
;; point/mark exchange, revert that exchange.
(when modi/drag-stuff--point-mark-exchanged
(exchange-point-and-mark) ; restore the original point and mark loc
(setq modi/drag-stuff--point-mark-exchanged nil)))))
(defun modi/drag-stuff--rst-pt-post-drag ()
"Restore the `point' to where it was by forwarding it by one char after
the vertical drag is done."
(when modi/drag-stuff--point-adjusted
(forward-char 1)
(setq modi/drag-stuff--point-adjusted nil))
(when modi/drag-stuff--point-mark-exchanged
(exchange-point-and-mark) ; restore the original point and mark loc
(setq modi/drag-stuff--point-mark-exchanged nil)))
(add-hook 'drag-stuff-before-drag-hook #'modi/drag-stuff--adj-pt-pre-drag)
(add-hook 'drag-stuff-after-drag-hook #'modi/drag-stuff--rst-pt-post-drag)
Trình diễn cách kéo các dòng hoạt động trước và sau khi hack ở trên
Trước khi hack
line 1 line 1
▯line 2 line 5
line 3 --(M-x drag-stuff-down)--> ▯line 2 MOVED LINE
▮line 4 line 3 MOVED LINE
line 5 ▮line 4 MOVED LINE
Sau khi hack
line 1 line 1
▯line 2 line 4
line 3 --(M-x drag-stuff-down)--> ▯line 2 MOVED LINE
▮line 4 line 3 MOVED LINE
line 5 ▮line 5
Tổ hợp phím
Để đạt được hành vi giống như nhật thực, chỉ cần thêm các ràng buộc chính thích hợp:
(global-set-key (kbd "M-<up>") #'drag-stuff-up)
(global-set-key (kbd "M-<down>") #'drag-stuff-down)