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 触发条件:当文件的所有编辑器标签都关闭时
  • 自动保存:会触发 onWillSaveTextDocumentonDidSaveTextDocument