drag-stuff
Consulte el drag-stuff
paquete (también disponible en Melpa).
Luego puede seleccionar una región y usar drag-stuff-up
/ drag-stuff-down
para mover esa región hacia arriba / abajo.
Comportamiento alternativo al arrastrar líneas
Por defecto, los drag-stuff
comandos también arrastrarán la línea en la que point
está activada (incluso si el punto está en la primera columna). Si desea seleccionar, digamos 2 líneas enteras haciendo C-a C-SPC C-n C-n
, la selección se verá así
line 1
▯line 2
line 3
▮line 4
line 5
Tenga en cuenta que aquí tengo la intención de mover solo las líneas 2 y 3, no la línea 4 . Pero drag-stuff
moverá esa tercera línea también por defecto.
Ese era mi motivo favorito (y probablemente no se aplica a nadie más), por lo que solicité una solución al desarrollador del paquete . Aquí hay un truco que puede poner en su configuración de emacs después de requerirlo drag-stuff
si no desea este comportamiento predeterminado. El truco no moverá la línea actual SI el punto está en la columna 0 (primera columna).
;; https://github.com/kaushalmodi/.emacs.d/blob/master/setup-files/setup-drag-stuff.el
;; https://github.com/rejeep/drag-stuff.el/issues/4
(defvar modi/drag-stuff--point-adjusted nil)
(defvar modi/drag-stuff--point-mark-exchanged nil)
(defun modi/drag-stuff--adj-pt-pre-drag ()
"If a region is selected AND the `point' is in the first column, move
back the point by one char so that it ends up on the previous line. If the
point is above the mark, exchange the point and mark temporarily."
(when (region-active-p)
(when (< (point) (mark)) ; selection is done starting from bottom to up
(exchange-point-and-mark)
(setq modi/drag-stuff--point-mark-exchanged t))
(if (zerop (current-column))
(progn
(backward-char 1)
(setq modi/drag-stuff--point-adjusted t))
;; If point did not end up being on the first column after the
;; point/mark exchange, revert that exchange.
(when modi/drag-stuff--point-mark-exchanged
(exchange-point-and-mark) ; restore the original point and mark loc
(setq modi/drag-stuff--point-mark-exchanged nil)))))
(defun modi/drag-stuff--rst-pt-post-drag ()
"Restore the `point' to where it was by forwarding it by one char after
the vertical drag is done."
(when modi/drag-stuff--point-adjusted
(forward-char 1)
(setq modi/drag-stuff--point-adjusted nil))
(when modi/drag-stuff--point-mark-exchanged
(exchange-point-and-mark) ; restore the original point and mark loc
(setq modi/drag-stuff--point-mark-exchanged nil)))
(add-hook 'drag-stuff-before-drag-hook #'modi/drag-stuff--adj-pt-pre-drag)
(add-hook 'drag-stuff-after-drag-hook #'modi/drag-stuff--rst-pt-post-drag)
Demostración de cómo funcionan las líneas de arrastre antes y después del truco anterior
Antes de hackear
line 1 line 1
▯line 2 line 5
line 3 --(M-x drag-stuff-down)--> ▯line 2 MOVED LINE
▮line 4 line 3 MOVED LINE
line 5 ▮line 4 MOVED LINE
Después de hackear
line 1 line 1
▯line 2 line 4
line 3 --(M-x drag-stuff-down)--> ▯line 2 MOVED LINE
▮line 4 line 3 MOVED LINE
line 5 ▮line 5
Atajos de teclado
Para lograr el comportamiento similar a un eclipse, simplemente agregue las combinaciones de teclas apropiadas:
(global-set-key (kbd "M-<up>") #'drag-stuff-up)
(global-set-key (kbd "M-<down>") #'drag-stuff-down)