Переместите строку/регион вверх и вниз в emacs

Что самый легкий путь состоит в том, чтобы переместить выбранный регион или строку (если нет никакого выбора), или вниз в emacs? Я ищу ту же функциональность, как находится в затмении (ограничен к M-up, M-down).

78
задан Chris Martin 16 February 2016 в 10:35
поделиться

5 ответов

Строку можно переместить с помощью транспонированных строк , привязанных к 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)
42
ответ дан 24 November 2019 в 10:35
поделиться

Нет встроенного. Вы можете использовать транспонированные линии (C-x C-t), но вы не можете использовать его повторно. Посмотрите функции на http://www.schuerig.de/michael/blog/index.php/2009/01/16/line-movement-for-emacs/ .

Это тоже должно быть легко адаптировать к регионам.

1
ответ дан 24 November 2019 в 10:35
поделиться

Функция 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).
1
ответ дан 24 November 2019 в 10:35
поделиться

Я написал пару интерактивных функций для перемещения линий вверх/вниз:

;; 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, но вы можете использовать все, что захотите. Возможно, мне следует реализовать некоторые функции, которые работают с регионами.

9
ответ дан 24 November 2019 в 10:35
поделиться

Обновление: Установите пакет 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)
49
ответ дан 24 November 2019 в 10:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: