วิธีใดที่ง่ายที่สุดในการย้ายพื้นที่หรือเส้นที่เลือก (หากไม่มีการเลือก) ขึ้นหรือลงใน emacs ฉันกำลังมองหาฟังก์ชั่นเดียวกับที่อยู่ในคราส (ขอบเขต M-up, M-down)
วิธีใดที่ง่ายที่สุดในการย้ายพื้นที่หรือเส้นที่เลือก (หากไม่มีการเลือก) ขึ้นหรือลงใน emacs ฉันกำลังมองหาฟังก์ชั่นเดียวกับที่อยู่ในคราส (ขอบเขต M-up, M-down)
คำตอบ:
สายสามารถเคลื่อนย้ายโดยใช้transpose สายC-x C-t
ผูกไว้กับ Dunno เกี่ยวกับภูมิภาคแม้ว่า
ฉันพบนี้ข้อมูลโค้ด Elisp ที่ไม่สิ่งที่คุณต้องการยกเว้นคุณจะต้องเปลี่ยนผูก
(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)
อัปเดต:ติดตั้งmove-text
แพ็คเกจจาก Marmalade หรือMELPAเพื่อรับรหัสต่อไปนี้
นี่คือสิ่งที่ฉันใช้ซึ่งใช้ได้กับทั้งสองภูมิภาคและแต่ละสาย:
(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)
คุณควรลองdrag-stuff
!
มันทำงานเหมือนกับ eclipse Alt+ Up/ Downสำหรับบรรทัดเดียวและสำหรับสายภูมิภาคที่เลือก!
นอกจากนั้นยังช่วยให้คุณสามารถย้ายคำด้วยAlt+ Left/ Right
นี่คือสิ่งที่คุณกำลังมองหา! และยังมีให้บริการจากrepos ของ ELPA !
วิธีแก้ปัญหาอื่น ๆ ไม่เคยได้ผลสำหรับฉัน บางคนเป็นรถบั๊กกี้ (เปลี่ยนสายขณะเปลี่ยนลำดับ wtf?) และบางคนก็ย้ายพื้นที่ที่เลือกไว้อย่างแน่นอนโดยปล่อยให้บางส่วนของเส้นที่ไม่ได้เลือกไว้บนตำแหน่ง แต่ใช้drag-stuff
งานได้เหมือนในคราส!
และมากยิ่งขึ้น! คุณสามารถลองเลือกภูมิภาคและใช้Alt+ Left/ Right! สิ่งนี้จะเปลี่ยนพื้นที่ที่เลือกทีละอักขระไปทางซ้ายหรือขวา สุดทึ่ง!
หากต้องการเปิดใช้งานทั่วโลกให้เรียกใช้สิ่งนี้:
(drag-stuff-global-mode)
(drag-stuff-define-keys)
ในไฟล์ init ก่อนการเชื่อมโยงคีย์จะเริ่มทำงาน มีคำอธิบายใน github นี้: github.com/rejeep/drag-stuff.el
ฉันได้เขียนฟังก์ชันโต้ตอบสองสามรายการสำหรับการเลื่อนบรรทัดขึ้น / ลง:
;; 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)
การเชื่อมโยงคีย์เป็นสไตล์ IntelliJ IDEA แต่คุณสามารถใช้อะไรก็ได้ที่คุณต้องการ ฉันควรใช้ฟังก์ชันบางอย่างที่ทำงานในภูมิภาคด้วย
นี่คือตัวอย่างข้อมูลของฉันเพื่อย้ายบรรทัดปัจจุบันหรือบรรทัดที่ขยายโดยพื้นที่ที่ใช้งานอยู่ เป็นไปตามตำแหน่งเคอร์เซอร์และภูมิภาคที่ไฮไลต์ และจะไม่แตกเส้นเมื่อภูมิภาคไม่เริ่มต้น / สิ้นสุดที่เส้นขอบ (ได้รับแรงบันดาลใจจากคราสฉันพบว่าวิธีคราสสะดวกกว่า 'เส้นทรานสโพส')
;; 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)))
transpose-paragraph
ฟังก์ชั่นสามารถช่วยให้คุณ
คุณอาจต้องการดูส่วนทรานสโพสในคู่มือ Emacs โดยพื้นฐานแล้ว:
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).
ฉันใช้แพ็คเกจ smart-shift (ใน Melpa) สำหรับสิ่งนี้ โดยค่าเริ่มต้นจะย้อนC-C <arrow>
กลับเพื่อย้ายเส้นหรือภูมิภาค มันเคลื่อนที่ในแนวนอนโดยจำนวนเฉพาะโหมดหลัก (เช่น c-basic-offset หรือ python-indent-offset) ทำงานในภูมิภาคด้วย
;; binds C-C <arrows>
(when (require 'smart-shift nil 'noerror)
(global-smart-shift-mode 1))