当Scintilla编辑器第一次变得“脏”时,我需要做一些处理。 之前文档实际发生了变化。
SCN_SAVEPOINTLEFT
通知似乎是明显的候选人,但不幸的是,在之后发生了,导致文档变脏。
查看其他可用通知,{/ 1}}在发生更改后也会被解雇(当然SCN_MODIFIED
也是如此)。
我能想到的最好的方法是开始回放SCEN_CHANGE
进行宏录制(即保存文档或撤消所有更改时)。然后,当我用SCN_SAVEPOINTREACHED
检测到第一次更改时,我停止录制,撤消所有更改,直到我返回保存点,执行我的自定义处理(恰好修改文档中的日期字段),然后重播录制的宏可以恢复未完成的更改。
这看起来非常令人费解。有没有更简单的方法? (也许用SCN_BEFORECHANGE通知创建我自己的Scintilla自定义版本会更简单,但我更愿意避免创建一个分支。粗略地浏览一下来源表明这里有很多分数。必须发送通知,因此很容易错过一些。)
更新:真正的要求是当用户执行'撤消'首次修改文档后,自动'编辑和用户的第一次编辑在撤消缓冲区中的顺序不正确。最简单的解决方案是,不是强制自动更新是第一个,而是使用SCN_MODIFIED
/ SCI_BEGINUNDOACTION
将这两个操作合并为一个撤消操作。请参阅下面的评论,了解我是如何做到的。
答案 0 :(得分:1)
SCN_MODIFIED通知确实似乎符合您的规范。 modificationType
字段提供有关已执行操作的信息,包括:
SC_MOD_BEFOREINSERT 0x400 Text is about to be inserted into the document. SC_MOD_BEFOREDELETE 0x800 Text is about to be deleted from the document.