从MarsCode AI插件出发,探索如何在VSCode中实现代码补全提示和可交互命令

1,503 阅读5分钟

背景

前段时间,笔者被朋友安利了MarsCode AI,于是在VSCode中安装了这个插件。

经过一段时间的使用,笔者觉得这个插件非常好用,极大地减轻了写代码的负担。

在本文中,笔者将挑选其中的 补全提示在文件中显示可交互命令 这两个VSCode插件的内容来讲解。

补全提示

MarsCode被定义为一款智能编程助手。

笔者最喜欢的就是它的智能代码补全,往往打上一个名字或者注释,它就会帮你推荐一段代码(当然,不一定对,但是对的概率还是蛮高)。

所谓的“智能代码补全”在VSCode插件中就是 “补全提示”,至于智能还是不智能取决于插件开发者。

说到 补全提示 ,笔者又联想到了 代码提示 ,这两者是同一个东西吗?

答案是否定的! 补全提示代码提示 在VSCode中是两个不同的能力。

“补全提示” 会将提示内容直接显示在文档中,如下:(灰色部分就是补全提示)

image.png

而 “代码提示” 会为用户提供一个下拉框,用户可以从中选择合适的代码片段。

这种功能很常见,几乎所有写过代码的同学都应该见过:

image.png

那么,如何实现 “补全提示” 呢?

关键在于vscode.languages.registerInlineCompletionItemProvider

这是VSCode提供的用于注册一个补全提示项提供器的API。

当用户在编辑器中输入时,这个提供器可以根据当前的上下文提供相应的补全建议。

当然,说再多概念都不如写代码来的实在。

下面,笔者将通过一个简单的例子来讲解如何实现补全提示。

首先,定义一个名为registerInlineComplete的方法。

在这个方法内部注册一个补全项提供器,并返回这个提供器。

image.png

第一个参数pattern: '**/*.{ts,js}'表示这个补全提示只在 TypeScript 和 JavaScript 文件生效。

接下来,完善 provideInlineCompletionItems 中的代码。

只要用户光标所在行的内容不为空,就提供一个自动补全的提示 (这里取决于具体的需求,想怎么做就怎么做)。

image.png

注意这里的 respData,它代表的是补全提示的内容。

之所以这样命名,是因为在实际应用中,特别是像 MarsCode 这样的插件,自动补全的内容通常是动态生成的,需要根据上下文来推导接下来的内容,因此一般是通过接口返回的。

在获取到自动补全内容后,我们需要将其设置到文档中。

这就需要用到 vscode.InlineCompletionItem,它是一个构造函数,我们需要创建一个相关的实例。

vscode.InlineCompletionItem 的构造函数有三个入参:

  1. 插入的内容
  2. 插入的位置
  3. 当用户确认将内容插入后执行的命令

image.png

接下来,在插件的入口文件中引入 registerInlineComplete 函数,并调用它来注册补全提示功能。

image.png

最后,还需要配置插件的激活条件。

由于笔者在前面已经将补全提示限制在了TypeScript和JavaScript文件中,因此插件的激活也应该遵循同样的限制。

这样,只有当用户打开这两种类型的文件时,插件才会被激活。

image.png

插件效果演示:

20250118_183153.gif

文件中显示可交互命令

MarsCode AI插件在每个函数上显示了三个可交互命令,为用户提供了便捷的操作选项。

image.png

那么,MarsCode AI插件是如何实现这一功能的呢?

在VSCode中,这一功能被称为CodeLens,它是一种能够在代码编辑器中显示与代码上下文相关信息的功能。

这些信息通常以可交互的命令或链接的形式,出现在代码行的上方或下方。

要实现这一功能,首先需要使用vscode.languages.registerCodeLensProvider

image.png

这个API定义了一个方法provideCodeLenses,它会返回一个CodeLens[]数组。

每个CodeLens对象都包含了显示在编辑器中的文本、命令以及位置等信息。

通过注册 CodeLensProvider,开发者能够在特定的代码位置展示自定义的可交互命令,例如运行测试、查看文档、跳转到定义等。

下面,将通过一个简单的例子来讲解如何实现这一功能:

首先,需要注册一个CodeLensProvider,并且仅在JavaScript文件中生效。

image.png

接着,继续完善 provideCodeLenses的内容。

具体来说,我们要在每个function声明的上方添加一个可交互的“Run Tests”命令。这样,当用户在编辑JavaScript文件时,就可以直接在函数定义的位置看到这个命令,并通过点击它来执行相关的测试操作。

image.png

这里还用到了一个自定义的命令 ai2.runTests:

image.png

codeLens的代码已经写完,接下来还需要配置package.json。

在package.json中配置ai2.runTests命令,然后配置codeLenses开启

image.png

插件效果演示:

image.png

不对啊,MarsCode AI 插件还有图标和关闭按钮呢。

image.png

先说图标,可以图标和解释代码是一体的。

而title又只能是字符串,笔者试了几次最终还是不能随心所欲的插入自定义图标(有了解的大佬可以解释一下)。

只能插个输入法自带的图标上去。

image.png

image.png

最后是关闭按钮。

笔者查了相关资料,发现 CodeLens 并没有提供关闭功能。

也就是说,这个 x 其实也是一个类似 Run Tests 的命令。

安排.jpg

在provideCodeLenses中加一个CodeLens,同时加上新命令 ai2.closeCodeLens:

image.png

总结

本文借助两个简单的示例,阐述了如何开发VSCode插件中的代码补全和CodeLens功能。

需要说明的是,MarsCode AI插件所涉及的VSCode插件功能众多,本文并未全部涵盖。

笔者后续会在有空的时候,继续更新相关内容。