drag-stuff
Confira o drag-stuff
pacote (também disponível no Melpa).
Você pode selecionar uma região e usar drag-stuff-up
/ drag-stuff-down
para mover a região para cima / baixo.
Comportamento alternativo ao arrastar linhas
Por padrão, os drag-stuff
comandos também arrastam a linha point
em que está (mesmo que o ponto esteja na primeira coluna). Se você quiser selecionar, digamos 2 linhas inteiras C-a C-SPC C-n C-n
, a seleção será algo como isto
line 1
▯line 2
line 3
▮line 4
line 5
Observe que aqui pretendo mover apenas as linhas 2 e 3, não a linha 4 . Mas drag-stuff
moverá essa terceira linha também por padrão.
Essa foi a minha irritação (e provavelmente não se aplica a mais ninguém) e, portanto, solicitei o pacote dev para uma solução . Aqui está um truque que você pode colocar na sua configuração do emacs depois de solicitar, drag-stuff
se você não quiser esse comportamento padrão. O hack não moverá a linha atual SE o ponto estiver na coluna 0 (primeira coluna).
;; 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)
Demonstração de como as linhas de arrasto funcionam antes e depois do hack acima
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
Após o hack
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
Combinações de teclas
Para obter o comportamento semelhante ao eclipse, adicione as combinações de teclas apropriadas:
(global-set-key (kbd "M-<up>") #'drag-stuff-up)
(global-set-key (kbd "M-<down>") #'drag-stuff-down)