選択範囲の行頭の余計な空白を取り除く
選択範囲を最初にuntabifyしてしまってから、行頭のスペースの数が一番少ないところにあわせてそのスペースを取り去るというもの。最初は「バッファから選択範囲の文字列を取り出して加工して書き戻そう」と思ったのですけど、「選択範囲の文字列を変更」という関数がなんなのかわからなかったのでこうなりました。どうも「編集範囲を制限してからその範囲に処理を行う」というやり方の方がEmacsらしいようです。
(defun my-unindent-region (start end)
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region start end)
(untabify start end)
(goto-char (point-min))
(replace-regexp
(concat "^"
(make-string
(apply
'min
(mapcar
(lambda (line)
(progn
(string-match "^ *" line)
(match-end 0)))
(split-string (buffer-string) "\n")))
32))
""))))