“起猛了,编程时听到有人阴阳我”_程序员

我想,我大抵是病了,

每天一想到要上班,

我的身体就像中了魔咒似的,

沉重得动弹不得。

拖延、倦怠、提不起劲,

似乎所有负面状态都在向我袭来,

内心深处仿佛在呐喊:

“要不今天就划水摸鱼算了?”

“起猛了,编程时听到有人阴阳我”_程序员_02

可偏偏,这种自我放纵却让我更焦虑。既然现实中没人推我一把,那我就自己搞一个 VSCode “程序员毒舌伴侣”!在我浑身班味,只想躺平时,它能用自嘲式的黑色幽默帮我满血复活。

当我想放弃时,它会适时地提醒:“你看着空白屏幕发呆的样子,还挺有艺术感的。”

当我 p 人属性大爆发时,它会忍不住嘲讽:“打算拖到明年再写完这段代码吗?”

当我终于完成一个艰难的任务时,它也会阴阳怪气道:“恭喜你,离下一个 bug 又近了一步!”

如果你也像我一样时常需要一点推力,那就继续看下去吧,尝试用豆包MarsCode 来DIY 一个能随时“骂醒”你的“程序员毒舌伴侣”!


“程序员毒舌伴侣”开发

1. 在开发“程序员毒舌伴侣”前,完成 Node.js 和 Yeoman 及 VSCode Extension Generator 的安装:

npm install -g yo generator-code

2. 使用 Yeoman 生成一个 VSCode 插件模板,按照提示完成配置。建议类型选择 TypeScript

yo code

3. 在插件中安装 play-sound 库用于播放声音。

npm install play-sound

4. 在项目根目录下创建 sounds 文件夹,用于存放需要播放的声音。

5. 打开 src/extension.ts 文件,我们需要在这里添加、修改代码。需要注意的是,代码中播放声音的文件名需要和第 4 步存放的声音文件一致。

import * as vscode from 'vscode';
import * as path from 'path';
import play from 'play-sound';

// 创建音频播放器
const player = play({});
// 设置时间限制
const TIME_LIMIT = 30 * 1000;
// 记录窗口是否聚焦
let isWindowFocused = true;
// 记录累计活动时间的变量
let accumulatedActiveTime = 0;

export function activate(context: vscode.ExtensionContext) {
  // 注册命令
  let disposable = vscode.commands.registerCommand('extension.checkProblems', () => {
    // 获取所有诊断信息
    const allDiagnostics = vscode.languages.getDiagnostics();

    // 统计问题数量
    let problemCount = 0;
    allDiagnostics.forEach(([_, diagnostics]) => {
      problemCount += diagnostics.length;
    });

    // 如果问题数量大于 0,播放警告声音
    if (problemCount > 0) {
      playSound('a.mp3');
    } else {
      playSound('b.mp3');
    }
  });

  context.subscriptions.push(disposable);

  // 监听文件创建事件
  vscode.workspace.onDidCreateFiles(() => {
    // console.log('检测到创建文件');
    playSound('c.mp3');
  });

  vscode.workspace.onWillDeleteFiles(() => {
    // console.log('检测到删除文件');
    playSound('d.mp3');
  });

  // 监听窗口焦点变化事件
  vscode.window.onDidChangeWindowState((event) => {
    isWindowFocused = event.focused;
  });
  
  setInterval(() => {
    if (isWindowFocused) {
      accumulatedActiveTime += 5000; // 累加活动时间
      console.log('累计活动时间:', accumulatedActiveTime / 1000, '秒');

    }
    if (accumulatedActiveTime >= TIME_LIMIT) {
      playSound('e.mp3');
      accumulatedActiveTime = 0; // 重置累计活动时间
    }
  }, 5000);

}

function getProblemCount(): number {
  const allDiagnostics = vscode.languages.getDiagnostics();
  let problemCount = 0;
  allDiagnostics.forEach(([_, diagnostics]) => {
    problemCount += diagnostics.length;
  });
  return problemCount;
}

function playSound(fileName: string) {
  const soundPath = path.join(__dirname, '..', 'sounds', fileName);
  player.play(soundPath, (err) => {
    if (err) {
      console.error(`无法播放声音: ${err}`);
    }
  });
}

export function deactivate() { }

当你遇到看不懂的代码时,可以询问豆包MarsCode AI 助手。

例如:

「 vscode.languages.getDiagnostics() 的目的是什么」,AI 会告诉你,是为了获取文件的诊断信息,如警告、错误等。

“起猛了,编程时听到有人阴阳我”_人工智能_03

如果想修改代码,也可以在编写注释后等待自动补全代码。

“起猛了,编程时听到有人阴阳我”_计算机_04

6. 在项目根目录下创建 typings 文件夹,并在里面创建 play-sound.d.ts 文件,编写以下代码:

declare module 'play-sound' {
    interface PlayOptions {
      player?: string;
    }
  
    interface Player {
      play(fileName: string, callback?: (err?: Error) => void): void;
    }
  
    function play(options?: PlayOptions): Player;
  
    export = play;
  }

如果你不知道 play-sound.d.ts 文件的作用,同样可以询问豆包MarsCode AI 助手:

“起猛了,编程时听到有人阴阳我”_人工智能_05

7.  package.json tsconfig.json 进行修改   

//package.json文件
{
  "name": "extension-demo",
  "displayName": "extension_demo",
  "description": "",
  "version": "0.0.1",
  "engines": {
    "vscode": "^1.92.0"
  },
  "categories": [
    "Other"
  ],
  "activationEvents": [    
    "onCommand:extension.checkProblems",
    "*"
],
  "main": "./out/extension.js",
  "contributes": {
    "commands": [
      {
        "command": "extension-demo.helloWorld",
        "title": "Hello World"
      },{
        "command": "extension.checkProblems",
        "title": "Check Problems"
      }
    ]
  },
  "scripts": {
    "vscode:prepublish": "npm run compile",
    "compile": "tsc -p ./",
    "watch": "tsc -watch -p ./",
    "pretest": "npm run compile && npm run lint",
    "lint": "eslint src --ext ts",
    "test": "vscode-test"
  },
  "devDependencies": {
    "@types/mocha": "^10.0.7",
    "@types/node": "20.x",
    "@types/vscode": "^1.92.0",
    "@typescript-eslint/eslint-plugin": "^7.14.1",
    "@typescript-eslint/parser": "^7.11.0",
    "@vscode/test-cli": "^0.0.9",
    "@vscode/test-electron": "^2.4.0",
    "eslint": "^8.57.0",
    "typescript": "^5.4.5"
  },
  "dependencies": {
    "play-sound": "^1.1.6"
  }
}

//tsconfig.json文件
{
    "compilerOptions": {
        "module": "Node16",
        "target": "ES2022",
        "outDir": "out",
        "lib": [
            "ES2022"
        ],
        "sourceMap": true,
        "rootDir": "src",
        "strict": true,   /* enable all strict type-checking options */
        /* Additional Checks */
        // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
        // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
        // "noUnusedParameters": true,  /* Report errors on unused parameters. */
        "typeRoots": [
        "node_modules/@types",
        "typings"
        ]
    }
}

8. 完成之后就可以开始调试我们的“毒舌伴侣”:

点击上方的运行,选择「启动调试」,启动调试后,会自动打开一个 VSCode 窗口,我们随便选择一个本地项目打开。

“起猛了,编程时听到有人阴阳我”_人工智能_06

9. 打开项目后,可以随意尝试创建文件、删除文件以及持续编码30秒等工作,过程中就可以感受专属“程序员毒舌伴侣”对你的“冷嘲热讽”咯,它不仅能让你告别拖延,还会让你在与自己的对话中,找到一丝久违的动力。

“起猛了,编程时听到有人阴阳我”_计算机_07

开发至此“毒舌伴侣” 第一版就完成了,称它为第一版,是因为它现在只支持在连续编码一段时间,以及创建文件、删除文件时鼓励你。

如果你还有别的 idea ,欢迎继续完善“程序员毒舌伴侣”,将创意投稿给我们的话,有惊喜哦!!

关注豆包MarsCode 公众号,后台发送“毒舌”,即可领取对应源码和音频素材~