跳到主要内容

自定义编辑器和普通网页视图有什么差别?

结论​

普通网页视图是一块你自己的界面,和某份文档的保存、撤销、脏标记没有自动关系。自定义编辑器接管某种文件的打开方式,必须接入文档模型:内容从文档来,用户编辑要反映脏状态,保存要写回,备份和热退出也要能恢复。

展开​

清单用 customEditors 声明支持的 viewType 和文件模式。代码实现:

  • CustomTextEditorProvider:背后仍是文本文档。适合在网页里编辑 JSON、Markdown 源码,保存时改 TextDocument。
  • CustomEditorProvider:自定义文档模型。适合二进制或有自己撤销栈的设计文件。要实现打开、保存、备份、保存为、热退出。

文本自定义编辑器通常:

  1. resolveCustomTextEditor 里拿到 document 和 webviewPanel
  2. 把 document.getText() 发给页面
  3. 监听文档变化,更新页面
  4. 页面编辑后用 WorkspaceEdit 改文档,这样撤销和脏标记跟编辑器一致
  5. 不要绕过文档直接 writeFile,否则未保存状态和磁盘会分叉

普通 Webview 做不到也不该假装做到这些:没有「保存」入口,窗口热退出不会帮你备份编辑中的设计稿。

同一文件可以被文本编辑器和自定义编辑器轮流打开。你的页面要认文档版本,避免把旧内容写回去。

容易讲错的点​

  • 自定义编辑器仍然是 Webview,安全策略、资源 URI、消息协议一样都不能省。
  • 只实现了 resolve、没把编辑写回文档,用户会看到不能保存或保存是空的。
  • 文件选择器和默认编辑器优先级要在清单里写清楚,不然用户双击不会进你的编辑器。