Cách dễ nhất để di chuyển vùng hoặc dòng đã chọn (nếu không có lựa chọn) lên hoặc xuống trong emacs là gì? Tôi đang tìm kiếm chức năng tương tự như trong nhật thực (giới hạn với M-up, M-down).
Cách dễ nhất để di chuyển vùng hoặc dòng đã chọn (nếu không có lựa chọn) lên hoặc xuống trong emacs là gì? Tôi đang tìm kiếm chức năng tương tự như trong nhật thực (giới hạn với M-up, M-down).
Câu trả lời:
Một dòng có thể được di chuyển bằng cách sử dụng các dòng chuyển vị liên kết với C-x C-t. Dunno về các vùng mặc dù.
Tôi tìm thấy này đoạn elisp mà những gì bạn muốn, ngoại trừ bạn cần phải thay đổi các ràng buộc.
(defun move-text-internal (arg)
(cond
((and mark-active transient-mark-mode)
(if (> (point) (mark))
(exchange-point-and-mark))
(let ((column (current-column))
(text (delete-and-extract-region (point) (mark))))
(forward-line arg)
(move-to-column column t)
(set-mark (point))
(insert text)
(exchange-point-and-mark)
(setq deactivate-mark nil)))
(t
(beginning-of-line)
(when (or (> arg 0) (not (bobp)))
(forward-line)
(when (or (< arg 0) (not (eobp)))
(transpose-lines arg))
(forward-line -1)))))
(defun move-text-down (arg)
"Move region (transient-mark-mode active) or current line
arg lines down."
(interactive "*p")
(move-text-internal arg))
(defun move-text-up (arg)
"Move region (transient-mark-mode active) or current line
arg lines up."
(interactive "*p")
(move-text-internal (- arg)))
(global-set-key [\M-\S-up] 'move-text-up)
(global-set-key [\M-\S-down] 'move-text-down)
Cập nhật: Cài đặt move-textgói từ Marmalade hoặc MELPA để nhận mã sau.
Đây là những gì tôi sử dụng, hoạt động trên cả hai vùng và các dòng riêng lẻ:
(defun move-text-internal (arg)
(cond
((and mark-active transient-mark-mode)
(if (> (point) (mark))
(exchange-point-and-mark))
(let ((column (current-column))
(text (delete-and-extract-region (point) (mark))))
(forward-line arg)
(move-to-column column t)
(set-mark (point))
(insert text)
(exchange-point-and-mark)
(setq deactivate-mark nil)))
(t
(let ((column (current-column)))
(beginning-of-line)
(when (or (> arg 0) (not (bobp)))
(forward-line)
(when (or (< arg 0) (not (eobp)))
(transpose-lines arg)
(when (and (eval-when-compile
'(and (>= emacs-major-version 24)
(>= emacs-minor-version 3)))
(< arg 0))
(forward-line -1)))
(forward-line -1))
(move-to-column column t)))))
(defun move-text-down (arg)
"Move region (transient-mark-mode active) or current line
arg lines down."
(interactive "*p")
(move-text-internal arg))
(defun move-text-up (arg)
"Move region (transient-mark-mode active) or current line
arg lines up."
(interactive "*p")
(move-text-internal (- arg)))
(global-set-key [M-S-up] 'move-text-up)
(global-set-key [M-S-down] 'move-text-down)
Bạn nên thử drag-stuff!
Nó hoạt động chính xác giống như eclipse Alt+ Up/ Downcho các đường đơn, cũng như cho các đường vùng đã chọn!
Thêm vào đó, nó cho phép bạn di chuyển các từ bằng Alt+ Left/ Right
Đây chính xác là những gì bạn đang tìm kiếm! Và nó thậm chí có sẵn từ các repo ELPA !
Các giải pháp khác không bao giờ hiệu quả với tôi. Một số trong số họ đã bị lỗi (chuyển dòng trong khi thay đổi thứ tự của chúng, wtf?) Và một số trong số họ đang di chuyển chính xác vùng đã chọn, để lại các phần không được chọn của đường trên vị trí của chúng. Nhưng drag-stuffhoạt động chính xác như trong nhật thực!
Va thậm chi nhiêu hơn! Bạn có thể thử chọn một khu vực và sử dụng Alt+ Left/ Right! Thao tác này sẽ chuyển vùng đã chọn theo một ký tự sang trái hoặc phải. Kinh ngạc!
Để kích hoạt nó trên toàn cầu, chỉ cần chạy điều này:
(drag-stuff-global-mode)
(drag-stuff-define-keys)trong tệp init trước khi các liên kết khóa bắt đầu hoạt động. Điều này được giải thích trong github này: github.com/rejeep/drag-stuff.el
Tôi đã viết một vài hàm tương tác để di chuyển dòng lên / xuống:
;; move line up
(defun move-line-up ()
(interactive)
(transpose-lines 1)
(previous-line 2))
(global-set-key [(control shift up)] 'move-line-up)
;; move line down
(defun move-line-down ()
(interactive)
(next-line 1)
(transpose-lines 1)
(previous-line 1))
(global-set-key [(control shift down)] 'move-line-down)
Các keybinding là phong cách IntelliJ IDEA, nhưng bạn có thể sử dụng bất cứ thứ gì bạn muốn. Tôi có lẽ nên triển khai một số chức năng hoạt động trên các vùng.
Đây là đoạn mã của tôi để di chuyển dòng hiện tại hoặc các dòng được kéo dài bởi vùng hoạt động. Nó tôn trọng vị trí con trỏ và vùng được đánh dấu. Và nó sẽ không ngắt dòng khi vùng không bắt đầu / kết thúc ở (các) đường viền. (Nó được lấy cảm hứng từ nhật thực; tôi thấy cách làm nhật thực thuận tiện hơn so với 'đường chuyển vị'.)
;; move the line(s) spanned by the active region up/down (line transposing)
;; {{{
(defun move-lines (n)
(let ((beg) (end) (keep))
(if mark-active
(save-excursion
(setq keep t)
(setq beg (region-beginning)
end (region-end))
(goto-char beg)
(setq beg (line-beginning-position))
(goto-char end)
(setq end (line-beginning-position 2)))
(setq beg (line-beginning-position)
end (line-beginning-position 2)))
(let ((offset (if (and (mark t)
(and (>= (mark t) beg)
(< (mark t) end)))
(- (point) (mark t))))
(rewind (- end (point))))
(goto-char (if (< n 0) beg end))
(forward-line n)
(insert (delete-and-extract-region beg end))
(backward-char rewind)
(if offset (set-mark (- (point) offset))))
(if keep
(setq mark-active t
deactivate-mark nil))))
(defun move-lines-up (n)
"move the line(s) spanned by the active region up by N lines."
(interactive "*p")
(move-lines (- (or n 1))))
(defun move-lines-down (n)
"move the line(s) spanned by the active region down by N lines."
(interactive "*p")
(move-lines (or n 1)))
Có một mục trong wiki emacs chỉ dành cho điều này:
http://www.emacswiki.org/emacs/MoveLine
Đối với các vùng di chuyển:
Không có cài sẵn. Bạn có thể sử dụng dòng chuyển vị (Cx Ct) nhưng bạn không thể sử dụng nó nhiều lần. Xem các chức năng trên http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ .
Nó cũng phải dễ dàng để thích ứng với các vùng.
Các transpose-paragraphchức năng có thể giúp bạn.
Bạn cũng có thể muốn xem phần chuyển vị trong hướng dẫn sử dụng Emacs. Bản chất:
C-t
Transpose two characters (transpose-chars).
M-t
Transpose two words (transpose-words).
C-M-t
Transpose two balanced expressions (transpose-sexps).
C-x C-t
Transpose two lines (transpose-lines).
Tôi sử dụng gói dịch vụ thông minh (trong Melpa) cho việc này. Theo mặc định, nó quay lại C-C <arrow>để di chuyển một đường hoặc vùng. Nó di chuyển theo chiều ngang bởi một lượng chính của chế độ cụ thể (ví dụ: c-basic-offset hoặc python-indent-offset). Cũng hoạt động trên các khu vực.
;; binds C-C <arrows>
(when (require 'smart-shift nil 'noerror)
(global-smart-shift-mode 1))