drag-stuff
Schauen Sie sich das drag-stuff
Paket an (auch bei Melpa erhältlich).
Sie können dann eine Region auswählen und diese Region mit drag-stuff-up
/ drag-stuff-down
nach oben / unten verschieben.
Alternatives Verhalten beim Ziehen von Linien
Standardmäßig ziehen die drag-stuff
Befehle auch die Linie, auf der sie sich point
befinden (auch wenn sich der Punkt in der ersten Spalte befindet). Wenn Sie auswählen möchten, sagen wir 2 ganze Zeilen C-a C-SPC C-n C-n
, sieht die Auswahl ungefähr so aus
line 1
▯line 2
line 3
▮line 4
line 5
Beachten Sie, dass ich hier nur die Zeilen 2 und 3 verschieben möchte, nicht die Zeile 4 . Aber drag-stuff
wird diese dritte Zeile bewegen als auch standardmäßig.
Das war mein Liebling (und trifft wahrscheinlich auf niemanden zu) und so bat ich den Paketentwickler um eine Lösung . Hier ist ein Hack, den Sie nach Bedarf in Ihre Emacs-Konfiguration einfügen können, drag-stuff
wenn Sie dieses Standardverhalten nicht möchten. Der Hack verschiebt die aktuelle Linie nicht, wenn sich der Punkt in Spalte 0 (erste Spalte) befindet.
;; 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)
Demonstration, wie das Ziehen von Linien vor und nach dem obigen Hack funktioniert
Vor dem Hack
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
Nach dem 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
Tastenbelegungen
Um das Eclipse-ähnliche Verhalten zu erreichen, fügen Sie einfach die entsprechenden Tastenkombinationen hinzu:
(global-set-key (kbd "M-<up>") #'drag-stuff-up)
(global-set-key (kbd "M-<down>") #'drag-stuff-down)