工作区、文档与文件系统
工作区是当前窗口打开的零个、一个或多个文件夹。只打开一个文件、没有文件夹时,没有工作区,workspaceFolders 是 undefined,一部分能力会减弱,但仍然可以编辑文本。
三种打开方式
| 状态 | workspaceFolders | workspaceFile |
|---|---|---|
| 没有打开文件夹 | undefined | undefined |
| 打开一个文件夹 | 长度为 1 | undefined |
多根工作区 .code-workspace | 长度 ≥ 1 | 指向该文件的 Uri;未保存时 scheme 是 untitled |
rootPath 已废弃,用 workspaceFolders。多根工作区里不要假设只有 workspaceFolders[0]。和某个文件相关的逻辑用 workspace.getWorkspaceFolder(uri)。
onDidChangeWorkspaceFolders 只在已有工作区上增减文件夹时触发。第一个文件夹被换成另一个时,扩展宿主会重启,这个事件不会发。
文本文档和磁盘文件
TextDocument 是编辑器知道的一份文本,可能还没保存,也可能根本不在磁盘上(untitled、git 等 scheme)。document.getText() 读的是内存里的缓冲,不是磁盘。
TextEditor 是这份文档的一个可见编辑界面,上面有选区、可见范围、视图列。同一文档可以没有编辑器(打开过但标签关了,文档仍可能留在 workspace.textDocuments)。关标签不保证触发 onDidCloseTextDocument。
两种编辑
TextEditor.edit:改当前这个编辑器里的文档,回调里的 builder 只在回调期间有效。workspace.applyEdit(WorkspaceEdit):按Uri改一个或多个文档,也能创建、删除、重命名文件。不依赖「当前焦点在哪个编辑器」。
文件系统
workspace.fs 是编辑器的文件系统,能读写本地和远程文件,也能走别的扩展注册的 FileSystemProvider。远程窗口里它访问的是工作区那一侧,不是用户界面那台机器上的 Node fs。
文件监听优先用 createFileSystemWatcher。官方说明它在编辑器进程外执行,不要用 Node 的 fs.watch 代替。
onDidCreateFiles / onDidDeleteFiles / onDidRenameFiles 来自用户操作或 applyEdit,不会在别的程序改磁盘时触发,用 workspace.fs 直接改也不会触发。
虚拟文档
registerTextDocumentContentProvider 给某个 scheme 提供只读内容,例如从二进制生成的文本。用户打开 myscheme:/path 时,编辑器来要文本,扩展返回字符串。