これを、一度のundoが 関数hoge() を実行するまえに戻すような関数 hoge() のコードの書き方はできんもんでしょうか。
undoの利用に手を加えるのではなく、hoge() の実装による解決法を求めています。
よろしくお願いします。
---- code ----
(defun hoge()
(interactive)
(replace-string "foo" "bar" nil) ; (1)
(replace-string "xxx" "yyy" nil) ; (2)
)
標準機能ではなく拡張になりますが、下記のものを使用してはどうでしょうか。
http://www.bookshelf.jp/soft/meadow_33.html#SEC482
関数を開始する時点で (undo-group-boundary)を実行するようにし、
関数実行後にundo-group で、実行開始時まで戻るかと思います。
(defun hoge () (interactive) (format-replace-strings '(("foo" . "bar") ("xxx" . "yyy"))))
とか、如何でしょう?
おお、オミゴト。ありがとうございます。
———
では、正規表現による置換に対して同様な書き方はありませんかね?
つまり上記質問文のコードが次のようである場合です。
(defun hoge() (interactive) (replace-regexp "^foo" "bar" nil) ; (1) (replace-regexp "x+" "yyy" nil) ; (2) )
ちと力業ですが:
(defun remove-undo-boundary (last-boundary) (let ((l buffer-undo-list)) (when (and l (not (eq last-boundary l))) (while (and (cdr l) (not (eq last-boundary (cdr l)))) (if (null (cadr l)) (setcdr l (cddr l)) (setq l (cdr l))))))) (defun hoge () (interactive) (let ((last-boundary buffer-undo-list)) (replace-string "foo" "bar" nil); (1) (replace-string "xxx" "yyy" nil); (2) (remove-undo-boundary last-boundary)) )
多分悪影響はないと思いますが、おそるおそるつかってください。
ありがとうございます。これなら正規表現による置換にも使えそう。
buffer-undo-list のしくみがよく分かります。
勉強になります。
ありがとうございます。
なるほど、これも一つの手ですね。