マークがアクティブか否かで関数の動作を切り替え

このエントリで plus さんに作ってもらった関数を雛形に作ってみた.
(といっても, 中のコードをちょっと置き換えただけだけどね.)



別に慣れてしまったから問題は無いんだけど, 矩形処理の入力をマークがアクティブかどうかで切り替えれるようなの作ってみた.
あんまりテストしてないから何とも言えないけど, たぶん大丈夫.

(defun my-string-rectangle-or-transpose-chars (&optional arg)
 (interactive "*P")
 (if mark-active
     (progn
       (string-rectangle (region-beginning) (region-end) (read-from-minibuffer "String rectangle: "))
       (setq mark-active nil))
   (transpose-chars (or arg 1))))

(defun my-kill-rectangle-or-kill-line (&optional arg &optional fill)
 (interactive "P")
 (if mark-active
     (progn
       (kill-rectangle (region-beginning) (region-end) fill)
       (setq mark-active nil))
   (kill-line (or arg 1))))

(defun my-yank-rectangle-or-yank (&optional arg)
 (interactive "*P")
 (if mark-active
     (progn
       (yank-rectangle)
       (setq mark-active nil))
   (yank (or arg 1))))

マークがアクティブのときだけ, 矩形処理として動作する.
こいつらをそれぞれC-t, C-k, C-yに割当てておけば, 矩形処理のキー入力がすこし楽になるかも.
ちょっと試してみようかな.


作ってから検索してみて気付いた.
sense-regionの方が良い.
まあ, elispの勉強になったということで.



ついでにこんなのも作ってみた.
マークがアクティブだったならば, その選択した範囲を削除, もしくは, そこにペーストするって感じの動作(Windows風?).

(defun my-extended-delete-char (&optional arg &optional KILLFLAG)
 (interactive "*p")
 (if mark-active
     (progn
       (kill-region (region-beginning) (region-end))
       (setq mark-active nil))
   (delete-char (or arg 1) KILLFLAG)))

(defun my-extended-kill-line (&optional arg)
 (interactive "*p")
 (if mark-active
     (progn
       (kill-region (region-beginning) (region-end))
       (setq mark-active nil))
   (kill-line (or arg 1))))

(defun my-extended-yank (&optional arg)
 (interactive "*P")
 (if mark-active
     (progn
       (delete-region (region-beginning) (region-end))
       (yank (or arg 1))
       (setq mark-active nil))
   (yank (or arg 1))))

上2つは, 範囲選択していたならば, その範囲を削除する.
一番下のは, 範囲選択していたならば, その選択範囲を削除し, そこにkill-ringの内容を貼り付ける.
これもどっかにありそうだな・・・.