Hatena::Groupcadr

kozima の日記

2009-11-04

任意に指定した二つのリージョンを交換する

| 22:38

emacs で複数のものを入れ替えるコマンドには transpose-{chars|lines|sexps} などがありますが、たまにはそれで扱えないような入れ替え方をしたいことがあります。特に、やむをえない事情により S 式でないものを書いているときにはそういうことが多くなります。

そういうときにどうするのがいいのかよく分からないのですが、とりあえずこんなものを書いてみました。

(defun mylib-transpose-current-and-last-regions ()
  (interactive)
  (when (and (mark) (cdr mark-ring))
    (let ((start1 (point))
          (end1 #1=(prog1 (mark) (pop-mark)))
          (start2 #1#)
          (end2 #1#))
      (transpose-regions start1 end1 start2 end2))))

マークを三つ push してから呼ぶと、最初の二つのマークで囲まれる範囲と、最後のマークとポイントで囲まれる範囲を入れ替え。

kill-region して yank を二回やるのとどっちが楽かというと、たいして変わらないような気が書いた後でしてきました。最初に kill-region したときのマーク位置まで pop-mark で戻ればいいんであって。

さらに、事前準備として三つもマークを push するのに違和感があります。大幅な手間の削減にならないなら、この違和感と天秤にかけるとどっちに傾くか。