vscode插件开发笔记

vscode.workspace是 VS Code 中的一个命名空间,提供了一组与当前工作空间相关的 API。

可通过以下方式使用:

1. 获取当前工作空间的根文件夹路径
const rootPath = vscode.workspace.rootPath;

2. 获取当前所有已打开的编辑器对象
const textEditors = vscode.workspace.textEditors;

3. 监听编辑器对象打开和关闭事件
vscode.workspace.onDidOpenTextDocument((document: vscode.TextDocument) => {
    console.log('已打开文档', document.fileName);
});

vscode.workspace.onDidCloseTextDocument((document: vscode.TextDocument) => {
    console.log('已关闭文档', document.fileName);
});

4. 创建文件或文件夹
// 创建文件
const uri = vscode.Uri.file('/path/to/file');
const content = 'Hello World';
vscode.workspace.fs.writeFile(uri, new TextEncoder().encode(content));

// 创建文件夹
const uri = vscode.Uri.file('/path/to/folder');
vscode.workspace.fs.createDirectory(uri);

5. 读取文件或文件夹
// 读取文件
const uri = vscode.Uri.file('/path/to/file');
const fileContent = await vscode.workspace.fs.readFile(uri);

// 读取文件夹
const uri = vscode.Uri.file('/path/to/folder');
const folderFiles = await vscode.workspace.fs.readDirectory(uri);

6.workspace.workspaceFolders 是 VS Code API 中的一个属性,用于获取当前工作区下的所有文件夹。可以使用这个属性来操作当前工作区下的文件夹,比如实现对文件夹的批量操作、提取相关信息等。

vscode.languages.registerCompletionItemProvider用于注册VSCode的代码补全提供者。在VSCode编辑器中,当用户输入代码时,编辑器会通过注册的代码补全提供者自动给出代码补全建议。

使用该函数需要提供以下参数:

- language: string类型,表示支持自动补全的编程语言。
- provider: CompletionItemProvider类型,表示提供代码补全建议的对象。该对象包含一个provideCompletionItems函数,这个函数会在用户输入代码时自动被触发,返回一个代码补全建议列表。

示例:
vscode.languages.registerCompletionItemProvider('typescript', {
    provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
        // 返回代码补全建议
        return [
            new vscode.CompletionItem('console.log'),
            new vscode.CompletionItem('let'),
            new vscode.CompletionItem('const')
        ];
    }
});

上述代码将注册一个自动补全提供者,当用户在TypeScript文件中输入代码时,会自动弹出以下建议:console.log、let、const。

const Koa = require('koa');
const app = new Koa();

// 中间件用来检查请求是否超时
app.use(async (ctx, next) => {
  const timeout = 3 * 60 * 1000; // 将超时时间设置为3分钟(以毫秒为单位)
  let timer;

  // 记录当前时间和请求ID
  const start = Date.now();
  const requestId = Math.floor(Math.random() * 100000);

  console.log(`[${requestId}] Request started`);

  // 设置计时器来检查请求是否超时
  const timeoutPromise = new Promise((resolve, reject) => {
    timer = setTimeout(() => {
      clearTimeout(timer);
      reject(new Error(`[${requestId}] Request timed out after ${timeout}ms`));
    }, timeout);
  });

  try {
    // 使用Promise.race()函数同时等待下一个中间件或定时器触发,以确定哪个事件先发生
    await Promise.race([next(), timeoutPromise]);
    const duration = Date.now() - start;
    console.log(`[${requestId}] Request completed in ${duration}ms`);
  } catch (err) {
    console.error(err.message);
    ctx.status = 408; // 发送408 Request Timeout响应
    ctx.body = 'Request timed out';
  } finally {
    clearTimeout(timer); // 清除计时器
  }
});

// 在这里添加其他中间件和路由

app.listen(3000);


const image = 'nginx';
try {
  const output = execSync('docker images', { encoding: 'utf8' });
  const lines = output.trim().split('\n');
  const names = [];

  for (const line of lines) {
    const words = line.trim().split(/\s+/);
    const name = words[0];
    if (name === image) {
      names.push(name);
    }
  }

  console.log(names);
} catch (err) {
  console.error(`获取镜像 ${image} 信息失败: ${err.message}`);
}

在 Node.js 中,有一个名为 pidusage 的第三方库可以轻松获取监听某个端口的进程 ID。该库可以用于 Windows、macOS 和 Linux 等操作系统,安装方式为:
npm install pidusage
使用 pidusage 库获取进程 ID 的步骤如下:

导入 pidusage 模块:const pidusage = require('pidusage');
调用 pidusage() 方法获取指定端口的进程信息:pidusage(port, (err, stats) => {...});
在回调函数中获取进程 ID:const pid = stats.pid;
完整代码示例如下:
const pidusage = require('pidusage');

const port = 3000;
pidusage(port, (err, stats) => {
    if (err) {
        console.error(err);
        return;
    }
    
    const pid = stats.pid;
    console.log(`The PID of the process listening on port ${port} is ${pid}`);

Windows上killport:

const { execSync } = require('child_process');

function killPort(port) {
  const cmd = `netstat -ano | findstr :${port} | findstr LISTENING`;
  const result = execSync(cmd, { encoding: 'utf8' });
  const lines = result.trim().split('\n');
  if (lines.length > 0) {
    const parts = lines[0].trim().split(/\s+/);
    const pid = parts[parts.length - 1];
    execSync(`taskkill /F /PID ${pid}`, { encoding: 'utf8' });
    console.log(`Process with PID ${pid} has been killed successfully.`);
  } else {
    console.log(`No process is listening on port ${port}.`);
  }
}

killPort(8000);

使用Node.js中的exec方法执行命令时,如果有输出、错误或关闭,可通过一下事件对应监听(注意:如果代码中有同步阻塞,例如死循环,以下监听代码可能执行不到,所以最好别用同步写sleep,用setTimeout配合Promise):
const { exec } = require('child_process');

const command = 'dir /b';

const child = exec(command);

child.on('error', (error) => {
  console.error(`执行命令 ${command} 出错:${error}`);
});

child.stdout.on('data', (data) => {
  console.log(`输出结果为:${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`输出错误为:${data}`);
});

child.on('close', (code) => {

  // 子进程退出,输入输出流已关闭,但可能还有未处理完的数据
  console.log(`code:${code}`);
});

child.on('exit', (code) => {

  // 子进程退出,输入输出流已关闭,并且所有数据已处理完
  console.log(`code:${code}`);

});

vscode开发时,给界面增加loading效果的方法有以下几种:

1.使用vscode.window.withProgress方法,可以在状态栏或编辑器中显示一个进度条
2.使用vscode.window.setStatusBarMessage方法,可以在状态栏中显示一个文本消息
3.使用vscode.window.showInformationMessage方法,可以在右下角弹出一个通知消息
您可以参考以下代码示例:

// 使用vscode.window.withProgress方法
vscode.window.withProgress({
    location: vscode.ProgressLocation.Notification,
    title: "Loading...",
    cancellable: true
}, (progress, token) => {
    token.onCancellationRequested(() => {
        console.log("User canceled the long running operation");
    });

    progress.report({ increment: 0 });

    setTimeout(() => {
        progress.report({ increment: 10, message: "I am long running!" });
    }, 1000);

    setTimeout(() => {
        progress.report({ increment: 40 });
    }, 2000);

    setTimeout(() => {
        progress.report({ increment: 50 });
    }, 3000);

    var p = new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, 5000);
    });

    return p;
});

// 使用vscode.window.setStatusBarMessage方法
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
    let message = vscode.window.setStatusBarMessage("Loading...");
    setTimeout(() => {
        message.dispose();
        vscode.window.showInformationMessage('Hello World!');
    }, 3000);
});

// 使用vscode.window.showInformationMessage方法
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
    vscode.window.showInformationMessage('Loading...', { modal: true });
    setTimeout(() => {
        vscode.window.showInformationMessage('Hello World!');
    }, 3000);
});

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值