自定义编辑器和普通网页视图有什么差别?
结论
普通网页视图是一块你自己的界面,和某份文档的保存、撤销、脏标记没有自动关系。自定义编辑器接管某种文件的打开方式,必须接入文档模型:内容从文档来,用户编辑要反映脏状态,保存要写回,备份和热退出也要能恢复。
展开
清单用 customEditors 声明支持的 viewType 和文件模式。代码实现:
CustomTextEditorProvider:背后仍是文本文档。适合在网页里编辑 JSON、Markdown 源码,保存时改TextDocument。CustomEditorProvider:自定义文档模型。适合二进制或有自己撤销栈的设计文件。要实现打开、保存、备份、保存为、热退出。
文本自定义编辑器通常:
resolveCustomTextEditor里拿到document和webviewPanel- 把
document.getText()发给页面 - 监听文档变化,更新页面
- 页面编辑后用
WorkspaceEdit改文档,这样撤销和脏标记跟编辑器一致 - 不要绕过文档直接
writeFile,否则未保存状态和磁盘会分叉
普通 Webview 做不到也不该假装做到这些:没有「保存」入口,窗口热退出不会帮你备份编辑中的设计稿。
同一文件可以被文本编辑器和自定义编辑器轮流打开。你的页面要认文档版本,避免把旧内容写回去。
容易讲错的点
- 自定义编辑器仍然是 Webview,安全策略、资源 URI、消息协议一样都不能省。
- 只实现了 resolve、没把编辑写回文档,用户会看到不能保存或保存是空的。
- 文件选择器和默认编辑器优先级要在清单里写清楚,不然用户双击不会进你的编辑器。