人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Emacs Lispに関する質問です。下記のような hoge という関数を実行した直後にundoを実行すると、まず(2)の置換がキャンセルされ、さらにundoすることで(1)の置換がキャンセルされると思います。
これを、一度のundoが 関数hoge() を実行するまえに戻すような関数 hoge() のコードの書き方はできんもんでしょうか。
undoの利用に手を加えるのではなく、hoge() の実装による解決法を求めています。
よろしくお願いします。

---- code ----
(defun hoge()
(interactive)
(replace-string "foo" "bar" nil) ; (1)
(replace-string "xxx" "yyy" nil) ; (2)
)


●質問者: room661
●カテゴリ:コンピュータ
✍キーワード:BAR Emacs Lisp hoge nil String
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Mook
●30ポイント

標準機能ではなく拡張になりますが、下記のものを使用してはどうでしょうか。

http://www.bookshelf.jp/soft/meadow_33.html#SEC482


関数を開始する時点で (undo-group-boundary)を実行するようにし、

関数実行後にundo-group で、実行開始時まで戻るかと思います。

◎質問者からの返答

ありがとうございます。

なるほど、これも一つの手ですね。


2 ● pyopyopyo
●35ポイント
(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)
)

3 ● hujikojp
●35ポイント

ちと力業ですが:

(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 のしくみがよく分かります。

勉強になります。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ