リージョンがアクティブかどうかによって処理を分ける場合は、(region-active-p)を使います。
リージョンの開始位置は(region-beginning)、終了位置は(region-end)で取得できます。
例えば、次のように書きます。
(defun my/kill-region ()
"リージョンがアクティブならkill-region, そうでないならバッファ全体をkill."
(interactive)
(if (region-active-p)
(kill-region (region-beginning) (region-end))
(kill-region (point-min) (point-max))))
うまく動かなかったところ
(interactive "r")な関数にすると、引数でリージョンの開始位置と終了位置を取得できます。
(defun my/kill-region-not-working (&optional beg end)
(interactive "r")
(if (region-active-p)
(kill-region beg end)
(kill-region (point-min) (point-max))))
しかし、新たに開いたバッファでまだマークをセットしていない(C-SPCを押してない等)ときに実行すると、
The mark is not set now, so there is no region
とエコーエリアに出てうまく動きませんでした。
リージョンがアクティブかどうかによって処理を分ける場合は、(interactive)な関数にして、
(region-active-p)で判定し、(region-beginning)と(region-end)を使ってリージョンを指定するのが良さそうです。