我想,我大抵是病了,
每天一想到要上班,
我的身体就像中了魔咒似的,
沉重得动弹不得。
拖延、倦怠、提不起劲,
似乎所有负面状态都在向我袭来,
内心深处仿佛在呐喊:
“要不今天就划水摸鱼算了?”
可偏偏,这种自我放纵却让我更焦虑。既然现实中没人推我一把,那我就自己搞一个 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 会告诉你,是为了获取文件的诊断信息,如警告、错误等。
如果想修改代码,也可以在编写注释后等待自动补全代码。
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 助手:
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 窗口,我们随便选择一个本地项目打开。
9. 打开项目后,可以随意尝试创建文件、删除文件以及持续编码30秒等工作,过程中就可以感受专属“程序员毒舌伴侣”对你的“冷嘲热讽”咯,它不仅能让你告别拖延,还会让你在与自己的对话中,找到一丝久违的动力。
开发至此“毒舌伴侣” 第一版就完成了,称它为第一版,是因为它现在只支持在连续编码一段时间,以及创建文件、删除文件时鼓励你。
如果你还有别的 idea ,欢迎继续完善“程序员毒舌伴侣”,将创意投稿给我们的话,有惊喜哦!!