背景
前段时间,笔者被朋友安利了MarsCode AI,于是在VSCode中安装了这个插件。
经过一段时间的使用,笔者觉得这个插件非常好用,极大地减轻了写代码的负担。
在本文中,笔者将挑选其中的 补全提示 和 在文件中显示可交互命令 这两个VSCode插件的内容来讲解。
补全提示
MarsCode被定义为一款智能编程助手。
笔者最喜欢的就是它的智能代码补全,往往打上一个名字或者注释,它就会帮你推荐一段代码(当然,不一定对,但是对的概率还是蛮高)。
所谓的“智能代码补全”在VSCode插件中就是 “补全提示”,至于智能还是不智能取决于插件开发者。
说到 补全提示 ,笔者又联想到了 代码提示 ,这两者是同一个东西吗?
答案是否定的! 补全提示 与 代码提示 在VSCode中是两个不同的能力。
“补全提示” 会将提示内容直接显示在文档中,如下:(灰色部分就是补全提示)
而 “代码提示” 会为用户提供一个下拉框,用户可以从中选择合适的代码片段。
这种功能很常见,几乎所有写过代码的同学都应该见过:
那么,如何实现 “补全提示” 呢?
关键在于vscode.languages.registerInlineCompletionItemProvider
。
这是VSCode提供的用于注册一个补全提示项提供器的API。
当用户在编辑器中输入时,这个提供器可以根据当前的上下文提供相应的补全建议。
当然,说再多概念都不如写代码来的实在。
下面,笔者将通过一个简单的例子来讲解如何实现补全提示。
首先,定义一个名为registerInlineComplete
的方法。
在这个方法内部注册一个补全项提供器,并返回这个提供器。
第一个参数pattern: '**/*.{ts,js}'
表示这个补全提示只在 TypeScript 和 JavaScript 文件生效。
接下来,完善 provideInlineCompletionItems
中的代码。
只要用户光标所在行的内容不为空,就提供一个自动补全的提示 (这里取决于具体的需求,想怎么做就怎么做)。
注意这里的 respData
,它代表的是补全提示的内容。
之所以这样命名,是因为在实际应用中,特别是像 MarsCode 这样的插件,自动补全的内容通常是动态生成的,需要根据上下文来推导接下来的内容,因此一般是通过接口返回的。
在获取到自动补全内容后,我们需要将其设置到文档中。
这就需要用到 vscode.InlineCompletionItem
,它是一个构造函数,我们需要创建一个相关的实例。
vscode.InlineCompletionItem
的构造函数有三个入参:
- 插入的内容
- 插入的位置
- 当用户确认将内容插入后执行的命令
接下来,在插件的入口文件中引入 registerInlineComplete
函数,并调用它来注册补全提示功能。
最后,还需要配置插件的激活条件。
由于笔者在前面已经将补全提示限制在了TypeScript和JavaScript文件中,因此插件的激活也应该遵循同样的限制。
这样,只有当用户打开这两种类型的文件时,插件才会被激活。
插件效果演示:
文件中显示可交互命令
MarsCode AI插件在每个函数上显示了三个可交互命令,为用户提供了便捷的操作选项。
那么,MarsCode AI插件是如何实现这一功能的呢?
在VSCode中,这一功能被称为CodeLens,它是一种能够在代码编辑器中显示与代码上下文相关信息的功能。
这些信息通常以可交互的命令或链接的形式,出现在代码行的上方或下方。
要实现这一功能,首先需要使用vscode.languages.registerCodeLensProvider
。
这个API定义了一个方法provideCodeLenses
,它会返回一个CodeLens[]
数组。
每个CodeLens
对象都包含了显示在编辑器中的文本、命令以及位置等信息。
通过注册 CodeLensProvider,开发者能够在特定的代码位置展示自定义的可交互命令,例如运行测试、查看文档、跳转到定义等。
下面,将通过一个简单的例子来讲解如何实现这一功能:
首先,需要注册一个CodeLensProvider,并且仅在JavaScript文件中生效。
接着,继续完善 provideCodeLenses的内容。
具体来说,我们要在每个function
声明的上方添加一个可交互的“Run Tests”命令。这样,当用户在编辑JavaScript文件时,就可以直接在函数定义的位置看到这个命令,并通过点击它来执行相关的测试操作。
这里还用到了一个自定义的命令 ai2.runTests:
codeLens的代码已经写完,接下来还需要配置package.json。
在package.json中配置ai2.runTests命令,然后配置codeLenses开启
插件效果演示:
不对啊,MarsCode AI 插件还有图标和关闭按钮呢。
先说图标,可以图标和解释代码是一体的。
而title又只能是字符串,笔者试了几次最终还是不能随心所欲的插入自定义图标(有了解的大佬可以解释一下)。
只能插个输入法自带的图标上去。
最后是关闭按钮。
笔者查了相关资料,发现 CodeLens 并没有提供关闭功能。
也就是说,这个 x 其实也是一个类似 Run Tests 的命令。
在provideCodeLenses中加一个CodeLens,同时加上新命令 ai2.closeCodeLens:
总结
本文借助两个简单的示例,阐述了如何开发VSCode插件中的代码补全和CodeLens功能。
需要说明的是,MarsCode AI插件所涉及的VSCode插件功能众多,本文并未全部涵盖。
笔者后续会在有空的时候,继续更新相关内容。