He estado usando eclipse durante un tiempo y encontré algunos accesos directos muy útiles, en particular la capacidad de mover una selección rectangular de líneas hacia arriba y hacia abajo usando Alt + Arriba / Abajo. He estado buscando esta funcionalidad en emacs. Hasta ahora he encontrado el siguiente script:
(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-up] 'move-text-up)
(global-set-key [\M-down] 'move-text-down)
Esto funciona, excepto por el hecho de que esto mueve la selección . Preferiría mover todas las líneas (incluida la nueva línea final) incluidas en la selección. ¿Hay alguna manera de darse cuenta de esto también?
Respuestas:
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 quepoint
está activada (incluso si el punto está en la primera columna). Si desea seleccionar, digamos 2 líneas enteras haciendoC-a C-SPC C-n C-n
, la selección se verá así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).Demostración de cómo funcionan las líneas de arrastre antes y después del truco anterior
Antes de hackear
Después de hackear
Atajos de teclado
Para lograr el comportamiento similar a un eclipse, simplemente agregue las combinaciones de teclas apropiadas:
fuente
C-a C-SPC C-4 C-n
) o párrafos enteros ( ejemploC-a C-SPC M-}
). Sé que la hayM-h
, pero aún no me he acostumbrado a eso. ¡Imagínese lo molesto que podría ser si cada vez que terminara arrastrando mi párrafo seleccionado más la siguiente línea! :)Lo codifiqué hace mucho tiempo, lo uso todos los días .
fuente
Aquí hay una manera de hacer esto usando macros de teclado:
fuente
transpose-lines
que funciona de esta manera, pero esto solo funciona para líneas simples, como su sugerencia ...C-p
).