跳到主要内容

工作区、文档与文件系统

工作区是当前窗口打开的零个、一个或多个文件夹。只打开一个文件、没有文件夹时,没有工作区,workspaceFolders 是 undefined,一部分能力会减弱,但仍然可以编辑文本。

三种打开方式​

状态workspaceFoldersworkspaceFile
没有打开文件夹undefinedundefined
打开一个文件夹长度为 1undefined
多根工作区 .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 时,编辑器来要文本,扩展返回字符串。

参考​