Что самый легкий путь состоит в том, чтобы переместить выбранный регион или строку (если нет никакого выбора), или вниз в emacs? Я ищу ту же функциональность, как находится в затмении (ограничен к M-up, M-down).
Строку можно переместить с помощью транспонированных строк , привязанных к C-x C-t
. Хотя насчет регионов не знаю.
Я нашел этот фрагмент 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)
Нет встроенного. Вы можете использовать транспонированные линии (C-x C-t), но вы не можете использовать его повторно. Посмотрите функции на http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ .
Это тоже должно быть легко адаптировать к регионам.
Функция transpose-paragraph
может вам помочь.
Возможно, вы также захотите заглянуть в раздел transpose в руководстве 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).
Я написал пару интерактивных функций для перемещения линий вверх/вниз:
;; 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-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)