avatar

麦兜的小站

MDO.INK

  • 首页
  • 随笔
  • 知识库
  • 归档
  • 动态
  • 标签
  • 关于
Home 试开发一款vscode插件(中)
文章

试开发一款vscode插件(中)

Posted 2025-03-5 Updated 2025-03- 5
By power 已删除用户
19~24 min read

续上期我们新建好插件demo项目后,本期我带大家伙来完善一下里面的功能函数。在项目的过程中会讲解用到的api,具有什么功能,该如何触发等等。

1、下午三点提示

内容:三点几嚟,饮茶先啦

形式:弹窗提醒

api: vscode.window.showInformationMessage(str)

这个api是能在右下角弹窗,并显示参数内容,str类型是可以支持的,但似乎不支持jsx语句?尝试了一下jsx语句,发现并没有正确识别。

函数也比较简单,我就直接在上期文章末尾创建的countTime命令函数里直接添加了。 (传送门: 试开发一款vscode插件(上))

const countTime = vscode.commands.registerCommand('sanwu.countTime', function () {

    let time
    let conut = 0
    setInterval(() => {
        time = new Date()

        if(time.getHours() === 15 && count === 0) {
            count++
            vscode.window.showInformationMessage(`三点几嚟,*饮茶*先啦`)
        }
    }, 1000)
    context.subscriptions.push(countTime);
});

效果如下

2、检查当前文件行数

内容: 分组件啊分组件,一个文件10000行,屎山代码是吧!?

形式: 菜单命令触发带回调的弹窗提醒

api:

参数大于1的时候,就是带回调的弹窗函数
showInformationMessage(参数1是文本内容,参数2是选项,参数3是选项,参数4也是选项),可以有n个选项

vscode执行命令,可以执行vscode自带命令,也可以执行自定义的命令
vscode.commands.executeCommand

vscode自带命令,可以打开窗口和网页
vscode.open

(1) package.json文件

这次我们换种触发方式了,onStartupFinished触发,打开vscode就激活该插件 其他activationEvents的激活时机可以看这个activation-events文档

"activationEvents": [
    "onCommand:sanwu.helloWorld",
    "onCommand:sanwu.countTime",
    "onStartupFinished"
 ],

然后在contirbutes里写下这些代码

"contributes": {
    "commands": [
      {
        "command": "sanwu.helloWorld",
        "title": "Hello World"
      },
      {
        "command": "sanwu.countTime",
        "title": "countT"
      },
      {
        "command": "sanwu.countLine",
        "title": "countLine"
      }
    ],
    "menus": {
      "editor/context": [
        {右
          "command": "sanwu.countLine",
          "group": "navigation",
          "when": "editorFocus"
        }
      ]
    }
  },

之前都是在其中的commands写下自定义命令而已,这次是要加上menus数组,可以实现自定义右边菜单功能,其中用到的命令,必须是commands里有的命令。

group(有navigation、1_modification、 9_cutcopypaste 、 z_commands这个四个)是这命令所在的位置,下面我放个图让大家伙看下区别

when是指触发时机

我用的是editorFocus,指单击该右键命令时,如果当前编辑器editor有聚焦,才触发回调命令

其他when的属性可以参考这个available-contexts文档

(2) extension.js文件

在package.json文件里配置好命令后,我们来extension.js文件撰写我们的主逻辑吧

顶部引入一下window对象,也可以直接用vscode.window,只是个人习惯

const { window } = vscode

然后在activate函数里注册countLine命令

const countLine = vscode.commands.registerCommand("sanwu.countLine", (currentUri) => {

    const editor = window.activeTextEditor
    if(!editor) {
        return
    }
    console.log(editor.document.lineCount)
    if(editor.document.lineCount > 10000) {

        watchLine(currentUri, editor)
    }
})
context.subscriptions.push(countLine);

为了不让active函数体积过于庞大,我将具体要实现的逻辑封装成函数,直接调用

function watchLine(currentUri, editor) {

    console.log('当前代码选中的绝对位置', currentUri.fsPath)

    console.log('可以获取当前光标所在行数', editor.selection)
    vscode.window
    .showInformationMessage("分组件啊分组件,一个文件10000行,想写屎山代码?", "是", "否", "不再提示")
    .then(result => {
            if (result === "是") {
                    vscode.window.showInformationMessage(`恭喜达成成就《啊对对对,这样以后我看谁还敢动我代码》`)
            } else if (result === "否") {

                    vscode.window.showInformationMessage(`不!我要去掘金跟大佬们学习!`)
                    setTimeout(() => {
                            vscode.commands.executeCommand(
                                    "vscode.open",
                                    vscode.Uri.parse(`https://juejin.cn/`)
                            )
                    }, 1000)
            } else if (result === "不再提示") {

                    vscode.window.showInformationMessage(`逆子`)
            }
    })
}

(3) 结果验证

开启调试,右键能正常弹出菜单,里面有新建的countLine命令

单击该命令,检查当前文件是否超过10000行(哈哈我找不到10000行的文件,就先把判断条件改成10行),超过会弹出右下角的弹窗。

点击选项-是 弹出成就

点击选项-否 弹出发奋图强宣言,并且打开掘金首页,vscode有安全机制,所以需要额外点击弹窗里的open

点击选项-不再提示 显示逆子(同时下次触发照样提示,因为我没写逻辑)

另外其中的几行代码,是在实验过程中发现的,感觉应该会有用,就留了下来。

console.log('当前代码选中的绝对位置', currentUri.fsPath)

console.log('可以获取当前光标所在行数', editor.selection)

今天就先到这里吧,下期看下再实现个什么功能,然后给大家伙讲讲如何发布打包,赶鸭子上架,写的一般般,有错误的地方还请指正。

知识库
License:  CC BY 4.0
Share

Further Reading

Jul 31, 2025

如何实现接口幂等性

通俗的说,用户在系统中有操作,不管重复多少次,都应该产生一样的效果或返回一样的结果的。 幂等性的概念 幂等(Idempotent)是一个数学与计算机学的概念,常见于抽象代数中。 f(n)=1^n//无...

Jul 19, 2025

10个npm工具包

有了npm之后,前端人员真的是过上好日子了。我们可以直接把别人写好的工具包拿来用,非常的方便。 1.day.js-轻量日期处理 npminstalldayjs importdayjsfrom'd...

Jul 17, 2025

How to set up PHP7.4 on MacOS.

Thisisallverywellandgood.Apartfromonesmallinsignificantthing… TheversionofPHPinuseiscurrently7.4. Th...

OLDER

试开发一款vscode插件(上)

NEWER

试开发一款vscode插件(下)

Recently Updated

  • 如何实现接口幂等性
  • 10个npm工具包
  • How to set up PHP7.4 on MacOS.
  • Automa:一键自动化,网页数据采集与工作流程优化专家Automa:解锁自动化
  • Mac 下用 brew 搭建 LNMP

Trending Tags

thinkphp clippings

Contents

©2025 麦兜的小站. Some rights reserved.

Using the Halo theme Chirpy