【发布时间】:2014-03-14 16:28:29
【问题描述】:
当 Scintilla 编辑器第一次变得“脏”时,我需要进行某些处理在文档实际更改之前。
SCN_SAVEPOINTLEFT 通知似乎是显而易见的候选者,但不幸的是,它在导致文档变脏的更改发生后被触发。
查看其他可用通知,SCN_MODIFIED 也会在更改发生后被触发(当然SCEN_CHANGE 也是如此)。
我能想到的最好的方法是响应SCN_SAVEPOINTREACHED(即在保存文档或撤消所有更改时)开始宏录制。然后当我用SCN_MODIFIED 检测到第一个更改时,我停止录制,撤消所有更改,直到我回到保存点,执行我的自定义处理(恰好是修改文档中的日期字段),然后重播录制的宏来恢复撤消的更改。
这看起来非常令人费解。有没有更简单的方法? (也许使用 SCN_BEFORECHANGE 通知创建我自己的自定义版本的 Scintilla 会更简单,但我更愿意避免创建分叉。粗略地浏览一下源代码表明有很多点来自该通知会必须发送,很容易错过一些。)
更新:真正的要求是当用户在第一次修改文档后执行“撤消”时,“自动”编辑和用户的第一次编辑在撤消缓冲区中的顺序没有错误。最简单的解决方案是,不是强制自动更新为第一个,而是使用SCI_BEGINUNDOACTION/SCI_ENDUNDOACTION 将这两个操作合并为一个撤消操作。请参阅下面关于我是如何做到这一点的评论。
【问题讨论】:
标签: notifications onchange scintilla