[xyzzy:08978] ed::diff-set-modified 修正 (lisp/diff.l)
- Subject: [xyzzy:08978] ed::diff-set-modified 修正 (lisp/diff.l)
- From: OHKUBO Hiroshi <konata_o@xxxxxxxxxxx>
- X-mailer: EdMax Ver2.85.5F
亀井さん、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/