アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

空白一つにこだわりたい

こんにちは、chibaです。
ネタがないので今回もEmacs lispの小ネタです。
文字列やS式をだらだら編集し、最後に空白一つ区切りで整形しようとしたときなのですが、間に改行が挟まっていると、just-one-spaceがきかないので、kill-lineしたりして調整することになります。

"foo
   bar
      baz"
=>
"foo bar baz"

自分はこれが非常にもどかしかったので、just-one-spaceを拡張したものを作成してみました。
といっても、just-one-spaceのソースが空白とタブしか飛していなかったので改行も加えただけです。

(defun just-one-space-to-next-sexp (&optional n)
  (interactive "*p")
  (let ((orig-pos (point)))
    (skip-chars-backward " \t\n")
    (constrain-to-field nil orig-pos)
    (dotimes (i (or n 1))
      (if (or (= (following-char) ?\s))
      (forward-char 1)
    (insert ?\s)))
    (delete-region
     (point)
     (progn
       (skip-chars-forward " \t\n")
       (constrain-to-field nil orig-pos t)))))
;; キーバインド例
(define-key  global-map [(meta shift ?\s)] 'just-one-space-to-next-sexp)

これで、すぱっと隣りに揃えられるので気持良いです。
リージョンやリストの中身を処理してくれる関数もあったら便利かもしれません。