You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置VS Code在保存失败时自动执行Cliosoft签出命令并重试保存

实现VS Code自动签出Cliosoft只读文件并重试保存

核心实现思路

利用VS Code的onWillSaveTextDocument事件拦截保存操作,通过event.waitUntil()(基于Thenable/Promise机制)异步执行以下逻辑:

  1. 先尝试保存目标文件
  2. 若保存失败(判定为只读权限问题),调用Cliosoft的soscmd -co命令签出文件
  3. 签出成功后重新尝试保存文件

完整扩展代码

将以下代码替换VS Code扩展项目中的extension.js文件:

const vscode = require('vscode');
const { exec } = require('child_process');
const util = require('util');
// 将回调式的exec转为Promise,适配async/await
const execPromise = util.promisify(exec);

async function activate(context) {
    // 注册保存前的监听事件
    const saveInterceptor = vscode.workspace.onWillSaveTextDocument(async (event) => {
        const doc = event.document;
        // 仅处理本地磁盘文件,跳过虚拟/远程文档
        if (doc.uri.scheme !== 'file') return;

        const filePath = doc.uri.fsPath;

        // 用waitUntil让VS Code等待我们的异步操作完成
        event.waitUntil(new Promise(async (resolve) => {
            let isSaved = false;
            try {
                // 先尝试直接保存
                isSaved = await vscode.workspace.saveTextDocument(doc);
            } catch (saveErr) {
                // 保存失败,尝试执行签出命令
                try {
                    await execPromise(`soscmd -co "${filePath}"`);
                    // 签出后重新尝试保存
                    isSaved = await vscode.workspace.saveTextDocument(doc);
                    if (isSaved) {
                        vscode.window.showInformationMessage(`已自动签出并保存:${filePath}`);
                    }
                } catch (execErr) {
                    vscode.window.showErrorMessage(`签出失败:${execErr.message}`);
                }
            }
            resolve(isSaved);
        }));
    });

    context.subscriptions.push(saveInterceptor);
}

function deactivate() {}

module.exports = {
    activate,
    deactivate
};

关键细节说明

  • Thenable/Promise机制:event.waitUntil()接收一个Thenable对象(Promise是Thenable的一种),VS Code会暂停默认的保存流程,等待Promise执行完成后再继续。这是实现异步操作(比如调用命令行)的核心。
  • 命令行调用:用util.promisify把Node.js原生的exec回调函数转为Promise,这样可以用async/await更清晰地处理异步命令执行。
  • 权限判断:通过捕获saveTextDocument的异常来判断文件是否为只读(Cliosoft未签出的典型表现),无需额外的权限检查逻辑。
  • 路径处理:确保文件路径用双引号包裹,避免路径含空格时命令执行失败。

注意事项

  1. 确保soscmd命令已加入系统环境变量PATH,或在代码中指定其绝对路径(比如Windows下"C:/Cliosoft/bin/soscmd.exe")
  2. 仅对本地文件生效,不支持远程或虚拟文档的自动签出

内容的提问来源于stack exchange,提问作者silvermaryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:43:17