vscode.window.activeTextEditor 可能为 null,需判空处理;获取光标位置应统一用 editor.selection.active;多光标仅暴露主光标;Position 行列号为 0-based,character 按 UTF-16 code units 计数。

vscode.window.activeTextEditor 可能为 null,必须先判空
直接调用 vscode.window.activeTextEditor 拿编辑器对象,是插件里最常见也最容易翻车的操作。它在以下场景会返回 null:用户焦点不在编辑器区域(比如正打开设置页、输出面板、调试控制台),或当前没打开任何文本文件,甚至刚启动 VS Code 尚未加载编辑器视图。
正确做法是加一层防御性判断:
const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showWarningMessage('请先打开一个文件并聚焦到编辑器');
return;
}
不要依赖 try/catch 包裹后续操作——null 访问是同步报错,catch 不住;更不能只靠注释提醒“请确保有编辑器打开”,用户不按流程走,插件就静默失败。
editor.selection 给的是选区,不是光标坐标
editor.selection 返回的是 Selection 对象,代表当前高亮选中的范围。如果用户只是把光标停在某处、没做任何选择,那 selection.start === selection.end,此时才能把它当“光标位置”用;但一旦有选中文本,start 和 end 就不同了,直接取 end 可能跳到选区末尾而非实际光标停留点。
真正反映“光标插入点”的,是 editor.selection.active —— 它始终指向键盘输入将发生的位置,无论是否选中内容:
- 无选中时:
active等于start和end - 有选中且光标在开头时:
active是start - 有选中且光标在末尾时:
active是end
所以获取“人眼看到的光标所在位置”,应统一用:const pos = editor.selection.active;
再通过 pos.line 和 pos.character 拿行列号。
多光标场景下 editor.selection 只返回主光标
VS Code 支持多光标编辑(如 Ctrl+D、Alt+Click),但 editor.selection 始终只暴露“主光标”(即最后激活的那个)的选区,其他光标位置完全不可见。插件 API 没有提供 editor.allSelections 或类似接口。
如果你的需求涉及全部光标(比如批量插入日志、统一缩进对齐),目前唯一可行路径是:
- 监听
TextEditorSelectionChangeEvent,自己缓存每次变化后的所有光标位置(需配合文档版本比对防误判) - 或改用装饰(
TextEditorDecorationType)+ 鼠标事件模拟定位,但这已脱离“获取位置”原始目标,属于行为重写
别试图从 editor.document.getText() 里反推——多光标位置没有文本锚点,无法可靠映射。
行号和列号从 0 开始,但错误日志/外部工具常用 1-based
Position.line 和 Position.character 都是 0-based,这和 VS Code 内部模型一致,但和大多数编译器错误、终端命令(如 grep -n)、甚至部分 LSP 协议返回的行号不一致。直接把 pos.line + 1 当作“第几行”显示给用户没问题,但若要传给外部 CLI 工具或第三方服务,务必确认其坐标系。
尤其注意 character:它计的是 UTF-16 code units,不是 Unicode 字符数。含 emoji 或某些生僻字时,"??".length === 2,character 值可能比直观字符数大。如需精确字符偏移,得用 Array.from(text).indexOf(...) 类方法重算。


















