[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:08978] ed::diff-set-modified 修正 (lisp/diff.l)



亀井さん、ML の皆さんこんにちは。
OHKUBO Hiroshi です。

lisp/diff.l の不具合に気が付きましたので報告します。

不具合内容は、「diff-undo (u キー) を行ってもバッファが編集済み
状態 (バッファ名の先頭に *) のままであることがある」というものです。

不具合の再現手順は以下の通りです。

----------------------------------------------------------------------
1. 複数の変更点のある new.txt, old.txt に対して diff を実行

2. *diff new* バッファにて以下を順に実行し、それぞれの状態を確認

   2.1   n キー押下 -> 変更行に移動
   2.2   m キー押下 -> "*diff old*" バッファが "* *diff old*" と変化
   2.3   n キー押下 -> 次の変更行に移動
   2.4   r キー押下 -> "*diff new*" バッファが "* *diff new*" と変化

3. 2. での変化を undo で解除 (2. から引き続きキー操作)

   3.1   u キー押下 -> ★2.4 での処理が undo されるが、"* *diff new*" のまま
   3.2   p キー押下 -> 2.2 での処理行に移動
   3.3   u キー押下 -> 2.1 での処理が undo され "*diff old*" へと変化
----------------------------------------------------------------------

期待する動作は 3.1 にて "*diff new*" となることです。

「diff-merge-reverse 関数で設定している reverse 値と、
  バッファローカル変数 diff-new-file-p の値の関係」が
diff-set-modified 関数で考慮対象となっていなかったことが原因でした
ので、以下のコードを .xyzzy に記述することで期待する動作となりました。

--- ここから ---------------------------------------------------------
(require "diff")
(in-package "editor")
(defun diff-set-modified ()
  (set-buffer-modified-p
   (find-text-attribute-if #'(lambda (x)
                               (and (consp x)
                                    (eq (car x) 'diff)
                                    (consp (cdr x))
                                    (consp (cadr x))
                                    (or (and diff-new-file-p (cdadr x))
                                        (and (not diff-new-file-p) (not (cdadr x)))))))))
(in-package "user")
--- ここまで ---------------------------------------------------------

以上、宜しくお願いいたします。

---
OHKUBO Hiroshi
konata_o@xxxxxxxxxxx
http://ohkubo.s53.xrea.com/

Index Home