drag-stuff
drag-stuff
パッケージをチェックしてください(Melpaでも入手可能)。
次に、リージョンを選択し、drag-stuff-up
/ drag-stuff-down
を使用してそのリージョンを上下に移動できます。
ラインをドラッグするときの代替動作
デフォルトでは、drag-stuff
コマンドはその上にあるラインもドラッグしますpoint
(ポイントが最初の列にある場合でも)。選択したい場合は、を実行して2行全体C-a C-SPC C-n C-n
とすると、選択は次のようになります。
line 1
▯line 2
line 3
▮line 4
line 5
ここでは、4行目ではなく、2行目と3行目だけを移動することに注意してください。ただしdrag-stuff
、デフォルトではその3行目も移動します。
それは私の不満だった(そしておそらく他の誰にも当てはまらない)ので、私はソリューションのパッケージ開発者に要求しました。このデフォルトの動作を望まない場合は、必要な後にemacs構成に追加できるハックを次にdrag-stuff
示します。ポイントが列0(最初の列)にある場合、ハックは現在の行を移動しません。
;; 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)
上記のハックの前後に線をドラッグする方法のデモ
ハッキング前
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
ハック後
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
キーバインド
日食のような動作を実現するには、適切なキーバインディングを追加するだけです。
(global-set-key (kbd "M-<up>") #'drag-stuff-up)
(global-set-key (kbd "M-<down>") #'drag-stuff-down)