vscode插件开发笔记

凤柏
2023-12-01

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);

 

 

 

 

 

 

 

 

 

 类似资料: