Перемещение линии / региона вверх и вниз в emacs
каков самый простой способ перемещения выбранной области или линии (если нет выбора) вверх или вниз в emacs? Я ищу ту же функциональность, что и в eclipse (ограничена M-up, M-down).
9 ответов:
линия может быть перемещена с помощью транспонировать строки обязан
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)
обновление: установить
move-text
пакет из мармелада или 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
!это работает точно так же, как затмение Alt+до/вниз для отдельных линий, а также для выбранных линий региона!
В дополнение к этому он позволяет передвигаться слова Alt+левый/право
Это именно то, что вы ищете! И это даже доступно из elpa repos!других решений никогда не работал на меня. Некоторые из них были глючными(транспонирование строк при изменении их порядка, wtf?) и некоторые из них двигались точно по выделенной области, оставляя невыбранные части линий на своих позициях. Но
drag-stuff
работает точно так же, как в eclipse!и даже больше! Вы можете попробовать выбрать регион и использовать Alt+левый/право ! Это позволит перенести выбранную область на один символ влево или вправо. Потрясающе!
To включите его глобально просто запустите это:
(drag-stuff-global-mode)
Я написал несколько интерактивных функций для перемещения линий вверх / вниз:
;; 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, но вы можете использовать все, что хотите. Наверное, я должен реализовать некоторые функции, которые работают с регионами.
есть запись в Emacs wiki только для этого:
http://www.emacswiki.org/emacs/MoveLine
для перехода регионов:
вот мой фрагмент для перемещения текущей строки или строк, охватываемых активной областью. Он уважает положение курсора и выделенную область. И он не будет ломать линии, когда область не начинается/не заканчивается на границе линии(s). (Это вдохновлено затмением; я нашел способ затмения более удобным, чем "транспонирование линий".)
;; 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-x C-t), но вы не можете использовать его повторно. Посмотрите на функции ВКЛ http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/.
Это должно быть легко адаптировать к регионам, тоже.
The
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))