Emacsで選択範囲の改行を置換する方法

検索する限りでは、M-x replace-regexpや M-x query-replace-regexpなどを使ってC-q C-jで置換する方法以外で、スクリプトとして置換するやり方はほとんどなかったみたいだった。かろうじてStack Overflowに自分がやりたいことを書いてくれているものがあった。

あったものを利用しているとちょっと間違った部分があったりしたのでそれを修正して使った。修正したあとのは下のスクリプト

;; 選択範囲中の行末の改行をdelimeterで置換する。
;; delimeterが""またはnilなら改行を置換するだけ
(defun* my-remove-newlines-in-region (&optional (delimeter "") (start (point)) (end (mark)))
  "Removes all newlines in the region."
  (interactive)
  (save-restriction
    (narrow-to-region start end)
    (goto-char (point-min))
    (if (null delimeter) (setq delimeter ""))
    (while (search-forward "\n" nil t) (replace-match delimeter nil t))))

置換する文字列。末尾に空白があったりなかったり。

hoge hoge hoge 
foo foo foo
bar bar bar 

置換する文字列を*scratch*に貼って、下のスクリプトをコピーする。そして、*scratch*で、M-:を押して、C-yでヤンクしてEnter。

;;これをコピーする
(let ((start (region-beginning)) (end (region-end)))
  (my-remove-newlines-in-region " " start end)
  ;;空白2つを1つにする
  (replace-regexp "  " " " nil start end)
  )

実行結果

hoge hoge hoge foo foo foo bar bar bar 

ちょっと拡張しすぎ感ある。