ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

2022-03-30 VsCode 中使用 clangd 插件的各种设置:TaoToken 统一 Key 接入与 config.toml 骨架

2022-03-30 VsCode 中使用 clangd 插件的各种设置:TaoToken 统一 Key 接入与 config.toml 骨架 1. 为什么要在 VsCode 里用 clangd 替代默认 C 插件如果你在 Windows 上用 MSYS2 的 clang64 工具链写 C/C大概率会遇到一个尴尬局面微软官方的 C/C 插件mscpp和 clangd 插件同时开着补全、跳转、报错提示互相打架代码补全要么不弹要么弹出来一堆对不上的符号。clangd 是 LLVM 官方出的语言服务器基于 clang 编译器前端做语义分析补全准确度和跨文件跳转比传统插件更贴近真实编译结果尤其适合用 clang 工具链的项目。这篇内容面向的是已经在 Windows 上装好 MSYS2、用 clang64 环境编译 C/C、想在 VsCode 里获得准确补全和统一格式化体验的开发者。核心链路分两段一段是 clangd 插件本身的配置可执行文件路径、参数、compile_flags.txt、.clang-format、.clang-tidy另一段是把 AI 辅助补全和代码格式化接进同一条通道用 TaoToken 的统一 Key 管理模型调用避免每个工具各配一套密钥。下面按可复制的顺序展开配置项都给完整骨架你照着改路径就能用。2. TaoToken 前置统一 Key 与 API 通道准备clangd 负责的是本地语义补全它不依赖网络。但当你想在 VsCode 里叠加 AI 辅助补全、代码解释、格式化建议时就需要一个稳定的模型调用入口。TaoToken 在这里的角色是统一 Key 和 API 通道你只维护一份密钥多个工具编辑器插件、命令行、Agent共用同一个入口省去到处填 Key 的麻烦。先到官网注册并进入控制台在 API Keys 页面创建一个 Key。地址如下官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI 基础地址是https://taotoken.net/api注意这个地址不带 UTM 参数直接用于代码里的 base_url。创建 Key 后先复制保存后面配置里会用到。如果你只是想先验证模型能不能通可以直接用模型对话页面试一条请求模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite长期在 VsCode 里做编码辅助、跑 Agent 类任务的话Coding Plan 更合适额度模型和按量调用不一样Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite注意Key 只存在本地配置文件或环境变量里不要提交到 Git 仓库。下面所有配置示例中的sk-xxxx都替换成你自己的 Key。3. clangd 插件与工具链的可复制配置3.1 安装与禁用冲突插件在 VsCode 扩展市场搜索 clangd安装 LLVM 官方那个。装完后必须禁用微软的 C/C 插件mscpp否则两个语言服务器会同时抢补全。禁用方式扩展面板找到 C/C点齿轮选「禁用工作区」这样只对当前项目生效不影响你其他项目。3.2 指定 clangd 可执行文件路径这一步是最容易踩坑的地方。插件自带一个 clangd 二进制但它不认识你 MSYS2 clang64 里的标准库头文件补全时会报找不到vector之类的错。所以必须手动指向你工具链里的 clangd。假设你的 MSYS2 装在K:\msys64clang64 环境的 clangd 路径就是K:\msys64\clang64\bin\clangd.exe。在 VsCode 的settings.json里写{ clangd.path: K:\\msys64\\clang64\\bin\\clangd.exe, clangd.arguments: [ --query-driverK:\\msys64\\clang64\\bin\\clang*, --completion-styledetailed, --header-insertionnever, --clang-tidy, --background-index, --compile-commands-dir${workspaceFolder} ], clangd.fallbackFlags: [ -IK:\\msys64\\clang64\\include\\, -IK:\\msys64\\mingw64\\include\\ ], clangd.serverCompletionRanking: true }参数逐个说明--query-driver让 clangd 去问 clang 编译器它内置的头文件搜索路径这是解决标准库找不到的关键--completion-styledetailed补全时带类型和签名--header-insertionnever禁止自动插头文件避免它乱加 include--clang-tidy开启静态检查--background-index后台建索引大项目跳转更快。clangd.serverCompletionRanking设为true是防止强制补全。如果设成falseclangd 会在你按空格时强行补全它认为该补的符号写代码时非常难受这个坑我踩过。3.3 compile_flags.txt 解决 C/C 混用问题fallbackFlags有个副作用它把所有文件都当 C 处理。你编辑.c文件时clangd 会用 C 标准去解析报一堆莫名其妙的错。解决办法是在每个子项目文件夹放一个compile_flags.txt明确指定语言和标准-xc -stdc11 -Wall -Ik:/msys64/clang64/include/ -Ik:/msys64/mingw64/include/C 项目则换成-xc -stdc17 -Wall -Ik:/msys64/clang64/include/ -Ik:/msys64/mingw64/include/-xc和-xc不能混用一个文件只能声明一种。这样 clangd 对 C 文件按 C11 解析对 C 文件按 C17 解析互不干扰。3.4 .clang-format 统一格式化风格在项目根目录建.clang-format基于微软风格改习惯 mscpp 格式化的人迁移过来最顺--- Language: Cpp BasedOnStyle: Microsoft IndentWidth: 4 ColumnLimit: 80 PointerAlignment: Right AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: Never BreakBeforeBraces: Custom BraceWrapping: AfterClass: true AfterControlStatement: Always AfterFunction: true AfterNamespace: true AfterStruct: true BeforeCatch: true BeforeElse: true SortIncludes: CaseSensitive IncludeBlocks: Preserve ...完整字段很长上面是核心项。ColumnLimit: 80控制行宽PointerAlignment: Right让int *p这种写法统一AllowShortIfStatementsOnASingleLine: Never强制 if 换行。格式化触发方式选中代码按ShiftAltF或在设置里开editor.formatOnSave: true保存自动格式化。3.5 .clang-tidy 静态检查规则项目根目录建.clang-tidy--- Checks: bugprone-*,\ google-*,\ misc-*,\ modernize-*,\ performance-*,\ readability-*,\ portability-* HeaderFilterRegex: .*\.(h|hpp|c|cpp)$ CheckOptions: - key: modernize-use-default-member-init.UseAssignment value: 1 - key: modernize-use-auto.MinTypeNameLength value: 80 ...规则开多了提示会很吵建议先只留bugprone-*和performance-*跑顺了再逐步加。clangd 会在编辑器里以波浪线形式给出建议鼠标悬停能看到具体规则名。4. 验证补全与格式化是否生效配置写完重启 VsCode 让 clangd 重新加载。验证分三步走。第一步打开一个.cpp文件输入std::vec看是否弹出std::vector的补全项并且带模板参数提示。如果弹不出来看右下角 clangd 状态图标点开看日志大概率是clangd.path指错了或者--query-driver路径没匹配上。第二步写一个故意有问题的代码比如int *p malloc(10);C 里 malloc 返回 void* 需要转换看 clangd 是否给出类型不匹配的提示。有提示说明 clang-tidy 和语义分析在工作。第三步格式化验证。随便写一段缩进混乱的代码按ShiftAltF看是否按.clang-format的规则重排。如果没反应检查文件是否在项目根目录下、.clang-format是否被 clangd 识别可以在输出面板选 clangd 看日志。AI 辅助补全这条链路用 TaoToken 的 Key 配好后可以在支持自定义 API 的插件里填https://taotoken.net/api作为 base_urlKey 填你创建的那串。验证方式发一条简单请求看是否正常返回。如果返回 401检查 Key 是否复制完整如果超时检查网络和 base_url 是否写成了带 UTM 的地址应该用不带参数的https://taotoken.net/api。5. 本篇常见错误排查clangd 报找不到标准库头文件九成是clangd.path指向了插件自带的 clangd而不是 MSYS2 clang64 里的。确认路径是K:\msys64\clang64\bin\clangd.exe并且--query-driver指向同目录的clang*。补全时按空格被强制补全检查clangd.serverCompletionRanking是否为true。这个选项名字有点反直觉设true反而是关闭强制补全。C 文件里报 C 语法错误fallbackFlags把所有文件当 C 了。在项目文件夹加compile_flags.txt第一行写-xc明确告诉 clangd 这是 C 文件。格式化不生效.clang-format必须在项目根目录且文件名不能拼错注意是.clang-format不是.clang-format.yaml。另外确认 VsCode 的默认格式化器选的是 clangd在settings.json里加[cpp]: {editor.defaultFormatter: llvm-vs-code-extensions.vscode-clangd}。mscpp 禁用后无法调试clangd 只管补全和静态分析不管调试。调试要装 CodeLLDB 插件launch.json里type写lldbprogram指向编译出的 exe。CodeLLDB 自带的 lldb 路径不要改用插件自己下载的那个这点和 clangd 要指向工具链里的二进制正好相反。调试时错误无法映射到问题窗口clang 的输出格式和 gcc 不同默认的 problemMatcher 抓不到。需要在tasks.json里自定义正则匹配文件:行:列: 消息这种格式把 file、line、column、message 分别映射到对应字段。6. 把 AI 补全接进同一条链路clangd 解决的是本地语义层AI 补全解决的是意图层两者叠加时最怕密钥散落各处。用 TaoToken 统一 Key 的好处是编辑器插件、命令行工具、Agent 都指向同一个https://taotoken.net/api换 Key 只改一处。如果你主要在 VsCode 里做长期编码建议走 Coding Plan额度模型更适合高频调用Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite接入过程中遇到报错先查接入文档里的错误码说明接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite需要新建或轮换 Key在 API Keys 页面操作API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite只想快速验证某个模型能不能用直接开模型对话页面发一条模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite配置这东西改完一处记得重启 VsCode 再验证clangd 的日志在输出面板选 clangd 就能看到大部分问题看日志都能定位。
返回列表