コメントかつコピー

スクリプトを作ったりしてるときによくあるのが、ちょっと変更するけどオリジナルは取っておくという操作。大抵は変えたい部分を複製して、オリジナルをコメントアウトすることになる。Emacsで愚直にやると、わざわざ該当部分をマークしてコピー(M-w)、もう一回マークし直してコメントアウト(C-;)、張りたいところに移動してペースト(C-y)することになる。これだとそもそも面倒だし、なにより変えたい部分が大きいようなときにさらに面倒くさい。マークするために一番上から一番下に移動してコピーをするわけなんだけど、このとき選択してたリージョンが解除されるので、もう一回コメントアウトのためにマークするために上に戻らなけりゃならない。その上、コメントアウトしたあとのカーソルは最後にあった場所にとどまるから、すぐ下にペーストしたいようなときは結局また一番下に移動する必要がある。

というわけで選択部分をコピーしてかつコメントアウトコメントアウトしたところの次の行あたりにカーソルが残るようなコマンドをElispで書いた。

(defun comment-and-copy ()
  (interactive)
  (if (region-active-p)
      (let ((rb (region-beginning))
            (re (region-end)))
        (progn (goto-char (1+ re))
               (goto-char (line-beginning-position))
               (kill-ring-save rb re)
               (comment-region rb re)))))
(global-set-key (kbd "M-'") 'comment-and-copy)

M-'('はUSキーボードで;のとなり)で動く。人生が明るくなる。