- 开发工具
- 代码编辑器
- 调试器
【免费下载链接】vscode_cangjie
本文基于 vscode_cangjie 开源仓库的《命令行工具集成》文档整理,系统讲解仓颉 VSCode 插件如何将 SDK 自带的 cjfmt、cjlint、cjcov 三个命令行工具集成进 IDE,覆盖格式化、静态检查(含保存时自动检查与 cjlintignore.cfg 屏蔽配置)与覆盖率报告的完整操作路径,并给出源码级实现依据。
仓颉 VSCode 插件(vscode_cangjie)不仅提供语言服务与调试能力,还深度集成了仓颉 SDK 自带的三个命令行工具:格式化工具 cjfmt(Cangjie Formatter)、静态检查工具 cjlint 与覆盖率统计工具 cjcov。开发者在代码编辑区或资源管理器中右键即可触发对应功能,无需离开 IDE 手动执行命令行。本文将按照 command-line_tools_integration.md 的脉络,逐一讲解这三个工具的入口、快捷键、输出形式与底层实现,并重点剖析"保存时自动静态检查"与 cjlintignore.cfg 屏蔽文件的机制。
说明:文中所用界面截图截取于 VSCode 软件界面,仅用于说明仓颉插件在 VSCode 中的使用方法。
前置条件:工具从哪来
三个功能分别对应仓颉 SDK 中的三个命令行工具。以格式化为例,插件在运行时并非内置格式化逻辑,而是动态拼接 SDK 下的可执行文件路径并调用子进程执行,见 cj-format.ts:
- SDK 根目录通过
Utility.getCangjieHome()获取,实际读取的是 VSCode 配置项CangjieSdkPath下的CJNativeBackend(或CJVMBackend)路径(utils.ts); - 工具真实路径为
<CangjieHome>/tools/bin/cjfmt(Windows 上为cjfmt.exe,见 cj-format.ts); - 若 SDK 路径无效或目录下不存在 cjfmt,插件会弹出
Please check sdk path、Format failed, no cjfmt tool等错误提示(cj-format.ts)。
因此,使用前请确认已按 install.md 完成 SDK 安装与路径配置:单击左下角齿轮图标进入设置,搜索Cangjie,在Cangjie Language Support中设置Cangjie Sdk: Option(默认CJNative)与Cangjie Sdk Path: CJNative Backend的绝对路径,重启 VSCode 生效。仓颉 SDK 提供的格式化工具 cjfmt 是插件格式化能力的底层依赖。
一、格式化(cjfmt)
1.1 格式化单个文件
针对仓颉源码文件,在 VSCode 的代码编辑区右键选择[Cangjie] Format,或使用快捷键Ctrl + Alt + F执行格式化命令,即可对当前仓颉文件进行格式化。
在命令注册层面,extension.formatCj与extension.formatCjFolder两个命令都指向同一个实现CjFormat.formatFunc(),其中快捷键ctrl+alt+f绑定在editorTextFocus条件下(package.json),右键菜单项则限定resourceExtname == .cj(package.json)。
从源码看,单文件格式化走cjfmt -f '<文件路径>',而文件夹格式化走cjfmt -d '<目录路径>'(Windows 下为避免路径含空格,改用双引号包裹,见 cj-format.ts):
# 单文件(Linux/macOS) cjfmt -f '/path/to/file.cj' # 文件夹(Linux/macOS) cjfmt -d '/path/to/dir'此外,插件对入参做了几道校验,理解这些校验有助于排查格式化失败问题(cj-format.ts):
- 路径不能包含
..且必须真实存在,否则直接返回失败; - 单文件场景下扩展名必须为
.cj,否则提示The plugin only can format Cangjie source code file; - SDK 路径无效或缺少
tools/bin目录时会分别报错。
1.2 格式化整个文件夹
针对仓颉项目,支持在 VSCode 的资源管理器中选中文件或右键单击文件夹,执行[Cangjie] Format命令,对所选文件或文件夹进行批量格式化。
资源管理器的右键菜单项extension.formatCjFolder的显示条件为resourceExtname == .cj || explorerResourceIsFolder(package.json),即选中.cj文件或任意文件夹时均可出现。底层通过fs.lstatSync判断目标是否为目录,目录走-d参数、文件走-f参数(cj-format.ts),由此实现了"文件/文件夹双模式"的同一入口设计。
二、静态检查(cjlint)
2.1 功能定位与检查范围
IDE 中的静态检查功能基于静态检查工具cjlint,该功能可以识别代码中不符合编程规范的问题,帮助开发者发现代码中的漏洞,写出满足 Clean Source 要求的仓颉代码。
说明:静态检查目前只能检测工程目录
src文件夹下的所有仓颉文件。
这里的src文件夹并非写死的路径:从 utils.ts 的getSrcPath()可以看出,插件优先解析工程根目录cjpm.toml中[package]段的src-dir配置,若未配置或路径非法,才回退到默认的src目录。因此文档所说"只能检测 src 文件夹",本质是默认工程结构下的表现。
2.2 两个检查入口
静态检查的入口有两处:
在 VSCode 的代码编辑区右键选择
[Cangjie] CodeCheck,或使用快捷键Ctrl + Alt + C执行静态检查命令,如下图所示。在 VSCode 的资源管理器处右键选择
[Cangjie] CodeCheck执行静态检查命令,如下图所示。
对应的命令注册为cangjie.cjlint(编辑区)与cangjie.cjlintFloder(资源管理器),快捷键ctrl+alt+c同样绑定在editorTextFocus条件(package.json)。两个命令共用 CjlintWebview 的init()逻辑。
2.3 检查结果的展示与跳转
执行静态检查命令后,如果有不符合编码规范的问题,会展示在右侧的表格中。单击表格中的文件链接,可以跳转到问题代码所在文件的行列。
结果表格的呈现链路值得关注,它印证了"表格 + 行列跳转"的完整闭环:
- 插件在工程 src 目录下执行
cjlint -f '<src路径>' -o ./report,命令完成后读取生成的report.json并解析(cjlint-webview.ts); - 解析结果通过
cangjie.codecheck.diagnostic命令交给 CjlintDiagnostic,将每条问题映射为 VSCode 的Diagnostic对象:defectLevel === 'MANDATORY'的问题以 Error 严重级别展示,其余为 Warning;行列号需从 1 起始换算为 VSCode 的 0 起始(item.line - 1、item.column - 1); - 同时结果被注入右侧表格页面 contentHtml.html,表格由 CjlintResult.js 动态生成,文件列渲染为可点击链接,点击后通过 Webview 消息回传
fileName/line/column,再由goFileLocation()打开对应文件并定位行列(cjlint-webview.ts)。
也就是说,编辑器内的问题标记(Diagnostics)与右侧表格是同一份检查结果的两面:前者由 VSCode 原生"问题"面板呈现,后者便于集中浏览与跳转。
2.4 保存后自动静态检查
当前支持代码保存后自动触发静态检查:开发者可以通过点击左下角齿轮图标,选择设置选项,在搜索栏输入cangjie,找到Code Check On Save选项,勾选该选项,即可开启自动触发静态检查。
该选项在插件配置中对应Cangjie.CodeCheckOnSave,类型为 boolean,默认值为false,描述为"Enable do CodeCheck in the folder where the file is currently saved"(package.json)。底层实现位于 cjlint-on-save.ts,核心机制包括:
- 事件监听:通过
onDidChangeTextDocument区分"编辑"与"保存"事件——有contentChanges视为编辑,否则视为保存并触发检查;同时onDidChangeActiveTextEditor会在切换编辑器时对当前.cj文件补一次检查(cjlint-on-save.ts); - 防抖去重:检查动作被
debounce包裹,等待窗口为CJLINT_WAIT_TIME = 2000毫秒,且用inOnSave标志避免重复触发(constant-num.ts、cjlint-on-save.ts); - 执行与清理:保存时在文件所在目录执行
cjlint -f <目录> -o <工程根目录>/report,检查过程中状态栏显示$(sync~spin) Cangjie-CodeChecking...,完成后解析report.json注入诊断并清理临时报告文件;若检查期间用户又编辑了代码,进程会被终止、报告被删除,避免展示过期结果(cjlint-on-save.ts)。
2.5 cjlintignore.cfg 屏蔽配置
开启自动静态检查后会在项目根目录生成一个cjlintignore.cfg配置文件,配置文件中可支持三类屏蔽方式,包括屏蔽文件、文件夹和正则表达式。每条配置项为相对该配置文件所在目录的相对路径(支持正则),无需双引号包含,自动静态检查支持将配置项匹配的仓颉文件屏蔽,不会产生关于这些文件的告警。例如在 cjlintignore.cfg 中有以下配置,则自动静态检查会将src/subdir1/目录和src/subdir2/a.cj文件加入屏蔽。
生成时机与生效方式都有明确的源码依据:
- 自动生成:插件激活时调用
CjlintOnSave.mkdirCjlintIgnoreCfg(),当CodeCheckOnSave开启且根目录尚无该文件时,写入空文件(cjlint-on-save.ts);配置项Cangjie.CodeCheckOnSave发生变更时也会再次触发该逻辑(launch-tools.ts); - 配置文件名常量:定义于 constant-num.ts(
CJLINT_CONFIG_NAME = 'cjlintignore.cfg'); - 生效方式:手动检查与自动检查两条路径都会在检测到该文件存在时,向 cjlint 命令追加
-e <相对路径>参数,将屏蔽文件传给检查工具(cjlint-webview.ts、cjlint-on-save.ts)。
由此可总结 cjlintignore.cfg 的书写要点:每行一个条目,内容为相对项目根目录(即配置文件所在目录)的路径,目录以/结尾,文件直接写路径,并支持正则表达式;条目不需要双引号包裹。符合匹配的仓颉文件将被屏蔽,不产生告警。
三、覆盖率统计(cjcov)
3.1 功能定位与使用约束
覆盖率统计功能用于生成仓颉语言程序的覆盖率报告。
注意:当选择的文件夹中不含有仓颉文件时,将不会生成覆盖率报告。
3.2 两个入口
覆盖率统计的入口有两处:
在 VSCode 的代码编辑区右键选择
[Cangjie] Coverage,或用快捷键Ctrl + Alt + G执行生成当前仓颉文件覆盖率报告的命令,如下图所示。在 VSCode 的资源管理器中选择文件或右键单击文件夹执行
[Cangjie] Coverage命令,对选择的文件或者文件夹生成覆盖率报告,如下图所示。
命令cangjie.cjcov(编辑区)与cangjie.cjcovFloder(资源管理器)由 CjcovWebview 注册,快捷键ctrl+alt+g绑定在editorTextFocus条件(package.json)。
3.3 生成流程与报告查看
在生成的覆盖率报告页面,可以单击文件名查看覆盖率详情。
与格式化、静态检查"单命令即完成"不同,覆盖率统计是一条流水线。从 cjcov-webview.ts 的命令常量与init()的调用序列可以还原完整链路:
cjpm update # 更新依赖(依赖未变更时通常很快) cjpm build --coverage # 开启覆盖率插桩的构建 cjpm run --skip-build # 运行程序,产生覆盖率数据 cjcov -o output --html-details -i <目标路径> # 生成 HTML 覆盖率报告 cjpm clean # 清理构建产物其中cjcov -o output --html-details生成带源码逐行着色详情页的 HTML 报告,-i指定待统计的目标文件/目录(即右键选择的对象)。每步失败都会中止后续流程并输出错误信息(cjcov-webview.ts)。报告生成后,插件以 Webview 面板打开工程output目录下的index.html,页面内文件名链接点击后回传路径,插件据此打开对应的详情页面(cjcov-webview.ts)。
这也解释了文档中的注意点:若所选文件夹中不含仓颉文件,则cjcov无内容可统计,自然也就不会生成覆盖率报告。
四、命令与快捷键速查
将三种工具在插件中的映射汇总如下(命令注册见 package.json、package.json、package.json):
| 功能 | 右键入口 | 快捷键 | 底层命令 | 底层工具 |
|---|---|---|---|---|
| 格式化单文件 | 编辑区[Cangjie] Format | Ctrl + Alt + F | cjfmt -f <文件> | cjfmt |
| 格式化文件/文件夹 | 资源管理器[Cangjie] Format | — | cjfmt -d <目录>/-f <文件> | cjfmt |
| 静态检查 | 编辑区[Cangjie] CodeCheck | Ctrl + Alt + C | cjlint -f <src路径> -o ./report | cjlint |
| 静态检查(文件夹) | 资源管理器[Cangjie] CodeCheck | — | 同上 | cjlint |
| 保存后自动检查 | 设置勾选Code Check On Save | — | 同上(防抖 2s) | cjlint |
| 覆盖率统计 | 编辑区[Cangjie] Coverage | Ctrl + Alt + G | cjpm update→cjpm build --coverage→cjpm run --skip-build→cjcov -o output --html-details -i <目标> | cjpm + cjcov |
五、常见问题与排查思路
结合上文源码行为,汇总几个高频问题的排查方向:
- 格式化/检查提示找不到工具:确认
CangjieSdkPath配置的 SDK 目录下存在tools/bin/cjfmt(Windows 为cjfmt.exe),并已重启 VSCode 生效;插件报错信息见 cj-format.ts。 - 静态检查没有任何结果:检查目标文件是否位于工程
src目录(或cjpm.toml的src-dir指定目录)内,这是静态检查的默认扫描范围;同时确认cjlintignore.cfg中是否有规则将其屏蔽。 - 保存后没有自动检查:确认设置中已勾选
Code Check On Save(Cangjie.CodeCheckOnSave默认关闭);检查过程带 2 秒防抖,快速连续保存时会合并触发。 - 覆盖率报告未生成:确认所选文件/文件夹包含仓颉源文件,且工程能正常执行
cjpm build --coverage与cjpm run --skip-build;任一步骤失败流水线都会中止。 - 路径含特殊字符:README 建议源码文件名与路径遵循仓颉规范命名,避免包含
[0-9a-zA-Z_]之外的字符,Windows 平台不支持含中文字符的源码文件名与路径场景,详见仓库 README_zh.md。
三个工具的实现分别位于 src/tools/src/format/cj-format.ts、src/tools/src/cjlint/(含 webview、诊断与保存触发三部分)与 src/tools/src/cjcov/cjcov-webview.ts,读者可结合本文对照源码深入理解每一步的命令构造与错误处理逻辑。
- 开发工具
- 代码编辑器
- 调试器
【免费下载链接】vscode_cangjie
相关推荐
ok-ww三步上手鸣潮自动化工具
ok ww三步上手鸣潮自动化工具 ok ww 是一款基于图像识别与界面操作模拟的鸣潮自动化工具,全程通过 Windows 接口模拟用户按键与点击,不读取内存、不
GUI 自动化计算机视觉RPA人工智能代码质量双引擎:Cangjie DevEco Plugins 的 cjformat 格式化与 cjlint 静态检查完整指南
代码质量双引擎:Cangjie DevEco Plugins 的 cjformat 格式化与 cjlint 静态检查完整指南 在 DevEco Studio 中
开发工具IDE调试器代码质量uBlock Origin:内存只多占 15MB,却拦掉九成请求的免费拦截器
uBlock Origin:内存只多占 15MB,却拦掉九成请求的免费拦截器 没有它,打开一个页面,网络面板里已经排着几十个跟踪请求。装上它,多数请求根本走不出
网络安全应用安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考