App下載

打造“程序員毒舌伴侶”:用豆包MarsCode激發(fā)編程動(dòng)力

來(lái)源: 豆包MarsCode 2025-01-08 10:26:07 瀏覽數(shù) (54)
反饋

原標(biāo)題:起猛了,編程時(shí)聽(tīng)到有人陰陽(yáng)我

我想,我大抵是病了,

每天一想到要上班,

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

沉重得動(dòng)彈不得。

拖延、倦怠、提不起勁,

似乎所有負(fù)面狀態(tài)都在向我襲來(lái),

內(nèi)心深處仿佛在吶喊:

“要不今天就劃水摸魚(yú)算了?”

可偏偏,這種自我放縱卻讓我更焦慮。既然現(xiàn)實(shí)中沒(méi)人推我一把,那我就自己搞一個(gè) VSCode “程序員毒舌伴侶”!在我渾身班味,只想躺平時(shí),它能用自嘲式的黑色幽默幫我滿(mǎn)血復(fù)活。

當(dāng)我想放棄時(shí),它會(huì)適時(shí)地提醒:“你看著空白屏幕發(fā)呆的樣子,還挺有藝術(shù)感的。

當(dāng)我 p 人屬性大爆發(fā)時(shí),它會(huì)忍不住嘲諷:“打算拖到明年再寫(xiě)完這段代碼嗎?

當(dāng)我終于完成一個(gè)艱難的任務(wù)時(shí),它也會(huì)陰陽(yáng)怪氣道:“恭喜你,離下一個(gè) bug 又近了一步!

如果你也像我一樣時(shí)常需要一點(diǎn)推力,那就繼續(xù)看下去吧,嘗試用豆包MarsCode 來(lái) DIY 一個(gè)能隨時(shí)“罵醒”你的“程序員毒舌伴侶”!

前置知識(shí)

要學(xué)習(xí)和理解這個(gè)關(guān)于創(chuàng)建“程序員毒舌伴侶”VSCode插件的教程,你需要具備以下編程基礎(chǔ)和技能:

編程語(yǔ)言和框架

VSCode 插件開(kāi)發(fā)

  • VSCode API:熟悉 VSCode 擴(kuò)展 API,了解如何使用 VSCode 提供的各種 API 來(lái)訪問(wèn)編輯器的功能,例如獲取診斷信息、監(jiān)聽(tīng)文件事件、注冊(cè)命令等。
  • Yeoman 和 VSCode Extension Generator:了解如何使用 Yeoman 和 VSCode Extension Generator 來(lái)快速生成 VSCode 插件的模板項(xiàng)目,包括項(xiàng)目的結(jié)構(gòu)和基本配置。

開(kāi)發(fā)工具和環(huán)境

  • VSCode :熟練使用 VSCode 編輯器,了解其基本功能和插件機(jī)制。
  • 命令行工具:能夠使用命令行工具(如 npm、Yeoman)來(lái)執(zhí)行項(xiàng)目生成、依賴(lài)安裝、調(diào)試等操作。推薦課程:《Linux命令行與Shell從入門(mén)到精通

其他相關(guān)知識(shí)

  • 事件監(jiān)聽(tīng)和處理:了解如何在插件中監(jiān)聽(tīng)和處理各種事件,例如文件創(chuàng)建、刪除事件,窗口焦點(diǎn)變化事件等。
  • 音頻播放庫(kù):了解如何使用第三方庫(kù)(如 play-sound)來(lái)播放音頻文件,并能夠處理相關(guān)的錯(cuò)誤和回調(diào)。
  • TypeScript 類(lèi)型聲明:了解如何為第三方庫(kù)編寫(xiě) TypeScript 類(lèi)型聲明文件(.d.ts),以便在 TypeScript 項(xiàng)目中正確使用這些庫(kù)。

軟件工程知識(shí)

  • 代碼組織和注釋:能夠合理組織代碼結(jié)構(gòu),并編寫(xiě)清晰的注釋?zhuān)员阌诖a的可讀性和維護(hù)性。
  • 調(diào)試技能:掌握基本的調(diào)試技能,能夠使用 VSCode 的調(diào)試工具來(lái)調(diào)試插件代碼,查找和修復(fù)問(wèn)題。

具備以上基礎(chǔ)和技能,將有助于你更好地理解和應(yīng)用教程中的內(nèi)容,從而成功地創(chuàng)建一個(gè)“程序員毒舌伴侶”VSCode插件。

“程序員毒舌伴侶”開(kāi)發(fā)

1. 安裝環(huán)境

在開(kāi)發(fā)“程序員毒舌伴侶”前,完成 Node.js 和 Yeoman 及 VSCode Extension Generator 的安裝:

npm install -g yo generator-code

2. 生成插件模板

使用 Yeoman 生成一個(gè) VSCode 插件模板,按照提示完成配置。建議類(lèi)型選擇 TypeScript

yo code

3. 安裝 play-sound 庫(kù)

在插件中安裝 play-sound 庫(kù)用于播放聲音。

npm install play-sound

4. 創(chuàng)建 sounds 文件夾

在項(xiàng)目根目錄下創(chuàng)建 sounds 文件夾,用于存放需要播放的聲音。

5. 編寫(xiě)代碼

打開(kāi) src/extension.ts 文件,我們需要在這里添加、修改代碼。需要注意的是,代碼中播放聲音的文件名需要和第 4 步存放的聲音文件一致。

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


// 創(chuàng)建音頻播放器
const player = play({});


// 設(shè)置時(shí)間限制
const TIME_LIMIT = 30 * 1000;


// 記錄窗口是否聚焦
let isWindowFocused = true;


// 記錄累計(jì)活動(dòng)時(shí)間的變量
let accumulatedActiveTime = 0;


export function activate(context: vscode.ExtensionContext) {
  // 注冊(cè)命令
  let disposable = vscode.commands.registerCommand('extension.checkProblems', () => {
    // 獲取所有診斷信息
    const allDiagnostics = vscode.languages.getDiagnostics();


    // 統(tǒng)計(jì)問(wèn)題數(shù)量
    let problemCount = 0;
    allDiagnostics.forEach(([_, diagnostics]) => {
      problemCount += diagnostics.length;
    });


    // 如果問(wèn)題數(shù)量大于 0,播放警告聲音
    if (problemCount > 0) {
      playSound('a.mp3');
    } else {
      playSound('b.mp3');
    }
  });


  context.subscriptions.push(disposable);


  // 監(jiān)聽(tīng)文件創(chuàng)建事件
  vscode.workspace.onDidCreateFiles(() => {
    playSound('c.mp3');
  });


  vscode.workspace.onWillDeleteFiles(() => {
    playSound('d.mp3');
  });


  // 監(jiān)聽(tīng)窗口焦點(diǎn)變化事件
  vscode.window.onDidChangeWindowState((event) => {
    isWindowFocused = event.focused;
  });


  setInterval(() => {
    if (isWindowFocused) {
      accumulatedActiveTime += 5000; // 累加活動(dòng)時(shí)間
      console.log('累計(jì)活動(dòng)時(shí)間:', accumulatedActiveTime / 1000, '秒');
    }


    if (accumulatedActiveTime >= TIME_LIMIT) {
      playSound('e.mp3');
      accumulatedActiveTime = 0; // 重置累計(jì)活動(dòng)時(shí)間
    }
  }, 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(`無(wú)法播放聲音: ${err}`);
    }
  });
}


export function deactivate() { }

當(dāng)你遇到看不懂的代碼時(shí),可以詢(xún)問(wèn)豆包MarsCode AI 助手

例如:

vscode.languages.getDiagnostics()的目的是什么」,AI 會(huì)告訴你,是為了獲取文件的診斷信息,如警告、錯(cuò)誤等。

詢(xún)問(wèn) AI

如果想修改代碼,也可以在編寫(xiě)注釋后等待自動(dòng)補(bǔ)全代碼。

自動(dòng)補(bǔ)全

6. 創(chuàng)建 TypeScript 類(lèi)型聲明文件

在項(xiàng)目根目錄下創(chuàng)建 typings 文件夾,并在里面創(chuàng)建 play-sound.d.ts 文件,編寫(xiě)以下代碼:

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 文件的作用,同樣可以詢(xún)問(wèn)豆包MarsCode AI 助手:

類(lèi)型聲明

7. 修改配置文件

修改 package.jsontsconfig.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,
    "typeRoots": [
      "node_modules/@types",
      "typings"
    ]
  }
}

8. 調(diào)試“毒舌伴侶”

完成之后就可以開(kāi)始調(diào)試我們的“毒舌伴侶”:

點(diǎn)擊上方的運(yùn)行,選擇「啟動(dòng)調(diào)試」,啟動(dòng)調(diào)試后,會(huì)自動(dòng)打開(kāi)一個(gè) VSCode 窗口,我們隨便選擇一個(gè)本地項(xiàng)目打開(kāi)。

調(diào)試

9. 體驗(yàn)“毒舌伴侶”

打開(kāi)項(xiàng)目后,可以隨意嘗試創(chuàng)建文件、刪除文件以及持續(xù)編碼30秒等工作,過(guò)程中就可以感受專(zhuān)屬“程序員毒舌伴侶”對(duì)你的“冷嘲熱諷”咯,它不僅能讓你告別拖延,還會(huì)讓你在與自己的對(duì)話(huà)中,找到一絲久違的動(dòng)力。

毒舌伴侶

開(kāi)發(fā)至此“毒舌伴侶” 第一版就完成了,稱(chēng)它為第一版,是因?yàn)樗F(xiàn)在只支持在連續(xù)編碼一段時(shí)間,以及創(chuàng)建文件、刪除文件時(shí)鼓勵(lì)你。

點(diǎn)擊「豆包MarsCode AI編程助手」即可體驗(yàn)豆包MarsCode~???

0 人點(diǎn)贊