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