核心类型
这些类型在命令参数、语言功能和文件 API 之间传来传去。executeCommand 调用内置命令时,也只额外放行其中的 Position、Range、Uri、Location。
Uri
统一资源标识。本地文件是 file scheme,未保存缓冲是 untitled,虚拟文档用自定义 scheme。
const uri = vscode.Uri.file('/tmp/a.ts');
const remote = vscode.Uri.parse('untitled:demo.ts');
// joinPath 按 URI 规则拼接,不要用字符串拼路径
const child = vscode.Uri.joinPath(uri, '..', 'b.ts');
常用字段:scheme、authority、path、query、fragment。远程和网页里不要把 fsPath 当成「用户界面那台机器上的路径」。
Position、Range、Selection
Position:行和字符,都从 0 开始。它指向字符之间的位置。Range:两个位置围出的区间,会自动保证 start 在 end 之前。Selection继承Range,并带方向:anchor是起点,active是光标。
const range = new vscode.Range(0, 0, 0, 4);
const pos = new vscode.Position(1, 0);
document.offsetAt / positionAt 在偏移和位置之间转换。document.getWordRangeAtPosition 取光标处的单词范围。
Location 与 LocationLink
Location 是 Uri 加 Range,用来表示定义、引用落在哪个文件的哪一段。LocationLink 还带原点范围和目标选择范围,转到定义时可以画得更精确。
TextDocument 与 TextEditor
TextDocument 是文本缓冲:uri、languageId、version、lineCount、getText、lineAt、isDirty、isClosed。
TextEditor 是可见界面:document、selection、selections、visibleRanges、viewColumn、options(缩进、光标样式)。edit 改的是这份文档。
EndOfLine、ViewColumn
EndOfLine 区分 \n 和 \r\n。ViewColumn 是编辑器组:One、Two、Beside、Active。
SnippetString
插入片段,支持占位符 $1、$2 和选择项 ${1|a,b|}。补全项的 insertText 可以是普通字符串或 SnippetString。