Ai时代vscode插件事件更加扑朔迷离了
ai最擅长的就是瞎分析, 能带着你狂奔
缘起
- 新写一种文件格式, 他天生的分为左子树和右子树, 要分栏展示.
- 前情: 2025-06-08-简单直白才是最好的之二分栏展示
- 此时需要精确的文件事件, 要卡准时间进行分栏替换展示, 分栏同时关闭并保存回源文件, 分栏同时展示. 所以需要各种恰当的事件.
ai表现
- 不只只是虚构接口, 为了满足我的要求他虚构了willopen接口, 并且形成了细致的指导.
- 而且关于事件的顺序和具体表现也是虚构的.
虚构接口, 满足需求
时序 | 文件打开 | ||
---|---|---|---|
事件 | vscode工作 | 可能性 | |
1 | onWillOpenTextDocument | 文件打开请求已接收 | 取消打开 |
2 | 文件加载 | ||
3 | onDidOpenTextDocument | TextDocument可用 | |
4 | 编辑器创建 | ||
5 | onDidChangeVisibleTextEditors | editor可用 | |
6 | 激活编辑器(焦点) | ||
7 | onDidChangeActiveTextEditor | ||
打开命令是可以拦截的
- 在willopen事件中拦截(建议)
vscode.workspace.onWillOpenTextDocument(event => {
if (shouldBlock(event.document)) {
// 取消打开
event.waitUntil(Promise.reject("Blocked by extension"));
// 一个拒绝的promise就可以了
vscode.window.showErrorMessage("文件被阻止打开");
}
});
- 拦截vscode默认打开行为(不建议)
vscode.commands.registerCommand('vscode.open', (uri) => {
if (uri.path.endsWith('.lock')) {
vscode.window.showErrorMessage('禁止打开锁文件!');
return; // 阻断默认打开行为
}
return vscode.commands.executeCommand('_originalOpen', uri); // 调用原始命令
});
需在package.json
中声明覆盖默认打开命令:
"contributes": {
"commands": [{
"command": "vscode.open",
"title": "Open File (Custom)"
}]
}
你看这整体方案是多么的合理, 可惜的是: onWillOpenTextDocument是她虚构的.
混乱的时序
- 文件关闭的时序, 更是在我的5次追问中, 保持一次都不对的状态. 实际情况应该是这样的, 大家不要去问ai了.
关闭未保存的激活文件
文件关闭 | ||||
---|---|---|---|---|
时序 | 事件 | VS Code 工作流程 | 干预可能性/触发条件 | 必选 |
1 | onWillSaveTextDocument |
保存前(如有未保存更改) | 有未保存, 可延迟/取消 | 否 |
2 | 文件保存到磁盘 | |||
3 | onDidSaveTextDocument |
文件保存完成 | 有未保存 | 否 |
4 | onDidChangeVisibleTextEditors |
编辑器不再可见 | 此瞬间没有editor, 即便还有别的文件打开, 参数editors列表也是空的. | 否 |
5 | onDidChangeActiveTextEditor |
激活编辑器转移到其他文件 | 此时本文件的editor=none | 否 |
6 | 编辑器视图销毁 | |||
7 | onDidCloseTextDocument |
TextDocument 从内存卸载 | 所有编辑器关闭后触发 | 是 |
onDidCloseTextDocument
触发条件:当文件的所有编辑器标签都关闭时- 自动保存:会触发
onWillSaveTextDocument
和onDidSaveTextDocument