AI副驾驶全IDE配置指南:从VS Code到JetBrains的踩坑与调优

发布时间:2026/10/14 15:57:58
AI副驾驶全IDE配置指南:从VS Code到JetBrains的踩坑与调优
2024 年大家都在聊编程效率革命而把“AI 副驾驶”装进每一个 IDE 这件事我算是踩坑踩得比较早的一批。今年我把主力开发环境从 VS Code 到 JetBrains 全家桶都接上了 AI 辅助工具基本把“写代码”这个动作从手敲变成了“审代码”。这篇内容不是什么广告软文就是一个普通开发者折腾了大半年之后的配置记录包括我为什么每个环境都要装、装的时候有哪些坑、以及最终稳定使用下来的一些调优细节。如果你也正准备把 AI 辅助编程纳入日常工作流或者已经装了但感觉自己用得比较浅这篇可以给你一个相对完整的参照系。1. 整体设计为什么每个 IDE 都要配 AI 副驾驶1.1 AI 副驾驶到底在解决什么问题先说一个很多人都有的困惑我本来就用一个 IDE 写得好好的为什么非要把所有 IDE 都装上我的情况比较典型日常主力是 VS Code用来写前端和脚本类代码偶尔会用 JetBrains 系列尤其是写 Java、Kotlin 或需要重构的项目时还有维护一些老项目时离不开 Sublime Text 那种轻量级体验作为折腾型选手Neovim 也占了相当一部分使用时间。不同项目、不同语言、不同体感需求到最后根本不是“我选 IDE”而是“项目帮我选 IDE”。如果 AI 辅助能力只在某一个编辑器里生效那换一个环境就等于裸奔效率波动非常大。所以“能在所有 IDE 里用上的 AI 副驾驶”这件事核心价值不在于工具数量多而在于三件事第一上下文延续性我在 VS Code 里的习惯和偏好换到 JetBrains 里也能保持一致第二反馈稳定性不会因为换了个编辑器就把已经建立起来的“写注释→看建议→手动微调”工作流切断第三减少学习成本快捷键和交互逻辑尽量统一肌肉记忆不用重新建立。至于 AI 副驾驶具体解决了什么底层问题我的理解是它把编码过程中的三块隐性成本压缩下来了。第一块是样板代码写接口、写 DTO、写单元测试、写配置文件时AI 生成之后我只需要确认逻辑第二块是上下文切换以前写完一个函数要去看另一个文件里的字段名字现在 AI 能根据当前打开的文件自动补全相关的字段引用省去大量来回跳转第三块是记忆负担有些第三方库的 API 记不住的时候直接在注释里描述意图让模型把代码写出来比去翻文档快得多。必须强调一点AI 副驾驶不是“自动写代码”的代名词它更像一个非常激进但偶尔犯错的实习生。真正把它用好的人不是最相信它的人而是最会“验收”它产出的人。这个定位想清楚了后面的配置思路才不会走偏。1.2 不同方案横向对比我为什么这样选型2024 年的 AI 编程插件市场其实已经非常拥挤了但大体上能分成三类。第一类是通用 AI 代码补全插件最有代表性的就是 GitHub Copilot兼容性最广覆盖几乎所有主流编辑器也是我最终选择全量使用的基础。第二类是 AI-first 编辑器它们把自己定位成“为 AI 重写的开发环境”比如 Cursor 这类体验确实更激进但问题在于我用不惯——它改变了我原有的工作流快捷键、插件体系、UI 布局都要重新适应对一个已经有多年代码习惯的人来说迁移成本远大于收益。第三类是某些 IDE 自带的 AI 助手比如 JetBrains 系列内置的 AI Assistant 方案这种方案和 IDE 集成最深但一旦离开这个 IDE 就没法复用灵活性不足。我最终的选型思路是以 Copilot 作为所有 IDE 的底座因为它覆盖范围广、模型能力均衡、社区解决方案多在此基础上针对特定 IDE 再做额外补充。比如在 JetBrains 里开启 AI Assistant 作为补充处理一些深度重构建议在 VS Code 里装一个备选插件用于对比建议质量避免某一家模型输出不稳定时没有候补方案。我并不是看哪个插件功能多就全塞进去而是按照“核心能力 备用方案”的结构搭建。衡量一个 AI 副驾驶是否可靠我会看四个维度建议触发速度、上下文理解能力、对多语言的支持程度、以及隐私策略。建议触发速度直接关系到会不会打断思路如果每次等待三秒以上那基本没法用在日常开发里上下文理解能力表现在“能不能读懂当前文件和相关文件的业务语义”而不是简单拼接上下文多语言支持这块写 JavaScript 和写 Java 时模型表现差异很大必须提前验证自己常用的语言隐私策略则是团队协作时必须考虑的底线问题。如果你问为什么最后没选 Cursor 或类似的 AI-first 编辑器我的答案是工具选型不能只看“最酷”的功能要看它在你的真实工作流里能不能无缝嵌入。我承认 Cursor 的创新度很高但对我来说“能用”和“好用”是两回事。AI 副驾驶的意义不是推翻现有的开发环境而是在现有环境之上做增强。与其重新学习一套工具不如把增强能力铺开到所有已经在用的工具里这是我的核心判断。2. 核心细节解析在不同 IDE 里的安装与启用要点2.1 VS Code接入 AI 副驾驶的标准姿势VS Code 是大部分开发者接触 AI 副驾驶的第一站因为它插件市场繁荣安装门槛最低。操作本身并不复杂打开扩展面板搜索 AI 插件的名称、点击安装、重新加载窗口、然后登录账号完成授权基本上就完成了。但真正决定使用体验的是一些细节设置。第一个是触发模式的调整。默认配置下AI 插件会在你停笔的时候自动触发建议但你可能会发现它在写注释时也频繁跳出非常干扰节奏。这种情况下我建议把自动触发延迟稍微调高一点同时把“按 Tab 接受建议”改成“按 Tab 接受、按 Esc 取消”这样大脑里会形成一个非常清晰的操作循环看到灰色建议 → 判断是否合理 → 合理按 Tab 确认不合理按 Esc 忽略。第二个细节是建议展示的数量和排序。VS Code 原生只显示一条建议但一些第三方插件可以在侧边栏展示多个候选方案。对于不太确定写法的场景多候选模式很有用而对于已经形成稳定写法的代码段单建议模式反而更干脆。我建议在前期调优阶段用多候选等风格稳定后再切成单建议。第三个要点是“用什么身份登录”。AI 插件通常会区分个人账号和团队账号如果你是在公司环境里使用一定要确认团队管理员是否统一开通了相关权限。个人账号虽然在功能上是完整的但遇到公司级的安全策略限制可能会造成整个 IDE 启动后插件被禁用。更关键的是团队账号会继承组织的代码审查规则AI 建议也会更贴合团队内部沉淀的代码规范这种差异在大型项目里非常明显。第四个容易被忽略的点是启动性能。VS Code 装了大量插件后启动速度会明显变慢而 AI 插件启动时还要做模型预加载这就更需要合理控制插件数量。我的经验是AI 类插件只保留一个主用比如 Copilot 一个备用比如 Tabnine 类不要图新鲜把同类插件装上七八个不然最后连 IDE 打开都是痛苦。2.2 JetBrains 全家桶深度集成与重构场景JetBrains 全家桶的安装路径跟 VS Code 差不多但体验非常不一样。通过插件市场安装完 AI 插件之后IDE 会在侧边栏额外增加一个 AI 工具的窗口面板相当于把 AI 对话能力直接内嵌到开发环境中。这个面板的用处在于它不只是写代码时候的补全工具还是一个可以针对整个项目层面进行问答和分析的入口。我在写 Java 项目的过程中最常用的几个场景是这样的第一当一个类太复杂时直接在 AI 面板里选中类名让插件给出拆分建议第二当某个方法报错但栈信息不够直观时把异常信息粘贴到面板让它快速列出可能原因第三在重构阶段让 AI 助手根据当前项目的命名风格生成一组更合适的类名和方法名。这种深度集成很多时候比在浏览器里打开对话窗口效率高得多。但 JetBrains 里安装 AI 插件有几个容易踩的坑。第一个是 IDE 版本兼容性问题很多 AI 插件的更新频率跟不上 JetBrains 的大版本节奏一旦 IDE 升到大版本而插件还没适配结果就是插件列表里直接变灰或是在启动时报“插件不兼容”的错误。解决办法不是回退 IDE 版本而是多关注插件的发布说明提前预判它是否支持当前 IDE 主版本。第二个坑是内存占用。JetBrains 的 IDE 本身就是一个内存吞噬者加载大型项目时已经让 16GB 内存的机器捉襟见肘再叠加 AI 插件的本地索引和模型预加载之后部分场景下卡顿会变得很明显。建议在 Help Change Memory Settings 里适度调高堆内存同时把 IDE 的“索引所有项目文件”改成“按需索引”避免每次打开大项目时全量扫描而触发 AI 插件同步计算。第三个坑是索引与缓存冲突。JetBrains 使用本地索引来加快搜索和跳转速度而 AI 插件会读取这些索引作为上下文。当项目里有大量自动生成文件比如 protobuf 生成的 Java 类、数据库逆向生成的实体类时AI 很容易被这些冗余代码带偏给出的建议毫无业务含义。所以一定要在项目的排除目录里把生成文件目录加进去比如把 build、target、generated 这些目录纳入排除列表既提升 IDE 性能也提升 AI 建议质量。2.3 Neovim 与终端党轻量场景同样不能落下如果你和我一样在日常开发里也使用 Neovim 来处理配置文件修改、快速查看日志或者写小型脚本那你肯定也有同感终端编辑器里没有 AI 辅助就像回到远古时代。好在目前 Copilot 已经官方支持 Neovim第三方插件也有不少方案这也是我在“所有 IDE 都装上 AI 副驾驶”这个目标里最满意的一部分因为终端里的 AI 结合 Neovim 的高效操作实际上带来的是完全不同于图形 IDE 的极简体验。我用的是 lazy.nvim 管理插件在配置文件中引入对应的 AI 插件之后再用:Copilot setup命令完成初始化即可。默认快捷键是 Ctrl Enter 来触发建议Alt ] 接受建议接受之后可以继续输入下一行。这个配置过程并不复杂真正复杂的反而是如何配合 Neovim 的模式切换。比如默认配置下输入模式下触发 AI 建议后按 Tab 接受同时还会触发 Neovim 自身的缩进逻辑如果你的自动缩进配置比较激进经常会出现“接受建议后缩进位置被强制改变”的诡异行为。这里我提供一个相对稳妥的做法在配置里把 AI 插件的接受键从 Tab 改成 Ctrl l和 Neovim 的换行操作区分开。这种细小的快捷键错位设计能避免很大部分模式切换和插件键位冲突的问题。另外一个建议是尽量保持 Neovim 配置的简洁性不要把 AI 插件和太多自动补全插件放在一起因为底层补全框架和 AI 文本生成触发逻辑较容易互相干扰最后出现每次输入时弹两个补全菜单选择体验非常分裂。还有一点就是性能和隐私的权衡。在图形 IDE 里AI 插件一般通过本地代理与远端模型服务通信而在 Neovim 里一般也是类似机制但你需要留意终端环境下代理配置是否正确。如果在公司内网环境里使用代理终端环境变量没有被正确设置那 AI 建议就会一直转圈不返回。这个排查点绝大多数人一开始不会想到这里我建议你在终端里先跑一下网络连通性的测试确认服务可访问再看插件配置。2.4 Sublime Text 与轻量编辑器用最小成本覆盖经典场景之所以我还会在 Sublime Text 里安装 AI 副驾驶是因为有些老项目的配置文件、日志处理、批量替换操作在 Sublime Text 里特别顺手而如果在这些场景下没有 AI 辅助遇到重复性很强的文本操作时还是会手工处理半天。Sublime Text 的 AI 插件数量不多但通过 Package Control 安装核心的 Copilot 插件之后基础的 AI 补全和对话功能都能正常工作。不过在实际使用中最明显的体验是Sublime Text 的插件对 AI 能力的暴露程度比其他编辑器要浅。它主要是提供自动补全而像对话式问答、深度重构这类重交互操作还是需要回到 VS Code 或 JetBrains 里完成。所以我在 Sublime Text 里对 AI 副驾驶的定位就是一个“文本补全加速器”比如快速生成重复的配置段落、补全枚举值列表、按已有注释插入对应的 JSON 字段等效率提升依然明显。安装完插件之后有一个关键步骤检查按键绑定是否生效。很多人在 Sublime Text 里装完 AI 插件后发现按快捷键没有任何反应多半是按键绑定被其它插件覆盖了。这时候需要打开菜单里的“Key Bindings”文件把 AI 插件的快捷键手动绑定到当前没有被占用的组合键上。这算是 Sublime Text 生态里的老问题几乎所有插件都会碰到只是 AI 插件因为涉及建议接受、拒绝、手动触发等多个操作冲突的概率更高。除了上述主流 IDE像 Vim 的传统模式、Emacs、甚至是某些内部定制编辑器只要有 LSP 支持或者 API 接口原理上都可以接入 AI 副驾驶。只是我个人评估下来维护成本会大于收益所以没有全部折腾。如果你有足够的时间和精力去研究这条路的尽头是非常自由的定制化 AI 编程环境但这需要以“编译插件、对接协议、处理认证”等大量底层工作为前提适合对工具链有强烈洁癖的朋友。3. 实操过程从安装到调优我把关键配置拆开讲3.1 全局开关与隐私策略配置AI 副驾驶看起来装完就能用但如果你不做全局开关和隐私策略的配置很容易在实际工作流里踩到两种情况一种是 AI 在你不熟悉的领域里乱给建议另一种是担心公司代码被发送到远端而产生心理负担最后干脆把插件关掉。这两种情况都会让 AI 工具沦为“安装了但不敢用”的摆设。先讲隐私策略。在 Copilot 的设置面板里通常有一个“允许云端匹配公共代码”或类似的开关它决定的是你在本地写的代码会被用来和公开代码库做匹配以便给出更贴近业界惯例的建议。如果你的工作内容是周边开源项目这个功能很有用但如果涉及核心商业逻辑建议直接关闭只保留基础代码生成能力。另一种更严格的方案是开启“不发送代码文本”模式但这种模式下 AI 不会分析你的代码上下文相当于只能根据注释和函数名给建议能力会大打折扣。再讲全局开关。我个人的习惯是设定一个快捷键一键切换 AI 建议的启用状态。写业务逻辑、算法代码这类需要高度专注的场景时我会手动关闭 AI 建议避免灰色补全干扰注意力而在写样板代码、测试用例、配置文件的时候再打开让 AI 大量生成我再做验收。这种“按需使用”而不是“始终使用”的模式才是 AI 副驾驶在较长一段时间内保持高效率的关键。还有一点非常容易被忽略AI 建议的触发范围其实是可以按文件类型定制的。比如.md文档文件、.lock依赖锁文件这些文件完全不需要 AI 参与而.ts、.py、.java这类源码文件需要启用。你可以在设置里配置一组文件扩展名白名单/黑名单让 AI 只在真正需要的地方运行。这样做能显著减少无效算力和视觉干扰我在配置完这个之后明显感觉编辑器干净很多。3.2 上下文调优如何让 AI 更懂你的项目很多人的 AI 副驾驶之所以“答非所问”根本原因不在模型而在上下文不完整。AI 补全工具不是凭空猜测你的意图它需要喂给它足够的上下文才能给出合理建议。这就像一个刚加入团队的新同事如果你只给他看一个函数签名他写出来的实现大概率是错的如果你把整个模块的设计文档和相关调用链丢给他他才能写出符合预期的代码。所以在日常编码里我需要让 AI 尽可能多地感知项目结构。有几个习惯非常有效第一把函数上方的注释写清楚说明这个函数输入什么、输出什么、边界条件是什么。我实测下来注释写清楚的函数AI 建议的准确率比不写注释时高出非常多而且给出的代码风格也会更接近我的预期。第二打开相关的类型定义文件哪怕只是瞄一眼也能让 AI 在后续的补全中直接引用正确的字段名。第三对于长文件保持文件前后端的逻辑完整性不要让 AI 面对一段“孤立的函数”去猜测它前后的调用场景。至于“是否要把整个项目索引都发给 AI”我的观点是需要分场景。小项目没问题大项目中把全量代码发给模型不仅慢而且噪音大AI 会盯着跟任务无关的代码做特征匹配反而给出不合适的建议。更合理的做法是让工具只读取当前文件、最近打开的若干个文件、以及通过注释或设置指定的关键上下文文件。很多 AI 插件都支持在文件顶部加特殊注释来标明“这个文件是核心领域模型生成代码时参考这里”灵活利用这种机制比单纯的“大而全索引”效果好得多。3.3 快捷键设计与操作习惯的重塑装完 AI 副驾驶之后最需要重构的不是 AI 本身而是你的手指记忆。以前写代码是“思考→输入→修改”的循环现在多了一个“评估建议”的动作。接受建议用什么键、拒绝建议用什么键、手动触发建议用什么键这些如果不在一开始就想清楚用两周之后就会出现肌肉记忆混乱你会习惯性地按 Tab 想要补全结果把 AI 建议收下了你会在想手动触发建议时按了奇怪的组合键结果弹出了搜索框。我建议的快捷键矩阵是在所有 IDE 和语言环境里尽量保持同一套逻辑。Tab 用于“接受建议”Esc 用于“取消/退出”Alt 1 或类似组合键用于“切换是否启用 AI 建议”Ctrl Enter 用于“手动触发完整行补全”即使在 Neovim 里我也尽量让操作逻辑与之对齐。人的手指记不住每个 IDE 里不同的快捷键但能记住同一个键位语义在不同环境里的一致性。这就是为什么我在配置每个 IDE 时第一件事就是重新映射 AI 相关快捷键保证全局统一。操作习惯的重塑也包括审阅节奏。以前写完函数编译报错再回头改流程很长现在 AI 在你输入的下一秒就给出建议你必须习惯在“这么短的时间里评估一段代码是否合理”的节奏。我个人比较推荐的做法是先看 AI 建议的前三个 token单词是不是你心里想的逻辑方向如果方向对再继续读下去如果方向不对直接 Esc 忽略。这种“快速判断方向”的能力是 AI 辅助编程时代最重要的新技能之一。4. 常见问题与排查技巧实录4.1 已登录但 AI 建议一直不出现这个问题安装过程里出现频率最高我自己的排查顺序是这样的先确认账号确实处于登录态在图形 IDE 里查看右下角状态栏是否有 AI 图标绿色代表已连接灰色代表未连接如果是灰色点开它会提示原因比如网络问题或者升级要求更新软件。如果状态正常但仍无建议检查当前文件类型是否被排除是否在设置里关闭了自动触发或者是否和某个代码格式化插件冲突了。如果这些原因都排除了有一个比较小众的情况你在 IDE 里打开了多个项目窗口而 AI 插件是按照“工作区”来判定激活状态的。你在主项目里登录了账号但副项目中插件可能认为你没有完成初始化。此时只需要关闭副项目窗口在主项目里确认初始化成功后再重新打开副项目。这个情况在新版本插件里会自动处理但旧版本确实存在。在 Neovim 环境里如果 AI 建议一直不出现最容易忽略的是插件配置顺序问题。AI 插件必须在文件类型检测插件和补全框架加载完成之后才能正常工作如果你把 AI 插件的配置写在init.lua的早期位置后面又被另一个插件覆盖了全局设置那它就会被静默禁用。排查办法是打开 Neovim 的 log 目录找到 AI 插件的日志文件里面一般会写明失败的具体阶段。4.2 AI 建议质量忽高忽低甚至给出明显错误代码这个问题不能全怪 AI很大程度是上下文和提示写得不够明确。AI 建议质量差第一个要检查的是当前函数的注释是否清晰如果注释只写了“处理数据”这种含糊描述那 AI 也只能给你一个含糊的实现。第二个要检查的是相关依赖文件是否已经打开或加入索引比如你写一个接口调用但模型连接口返回类型都没看到它当然只能给一个泛泛的类型。第三个要检查的是项目里是否存在过时代码和坏味道AI 会学习项目里的代码风格如果项目里本身就有大量反模式它给出的建议也会延续这些反模式。有时候问题出在模型本身。不同的触发场景下模型会自动调整上下文窗口的大小当上下文过大时模型可能会丢失最早的指令信息导致建议内容偏离。解决这个问题的办法是把任务拆小与其让 AI 生成一个 200 行的复杂函数不如把它拆成 4 个 50 行的子函数逐个生成。这就像给人布置任务一样目标范围太大时出错的概率也会指数上升。对于明显错误的代码我的处理习惯是不直接拒绝而是把它作为诊断起点。AI 给出的错误代码往往会揭示我对某个库的错误记忆我会把建议里的参数名和真实文档比对有时候能发现我原本记错了某个 API 的用法。从这个角度看AI 的“错误建议”也具有提示价值只要你不是全盘照收而把它当作一种主动检索辅助体验会提升很多。4.3 编辑器卡顿、内存占用飙升AI 插件确实会增加编辑器的资源消耗但如果你发现装了之后 IDE 直接卡到无法操作那大概率不是插件本身的锅而是插件与另一个高性能插件的冲突。比如某些着色插件、格式化插件或者语言服务器插件它们和 AI 插件在某个触发事件上同时工作导致主线程阻塞。排查方法比较朴素但有效先关掉所有非必要插件保留 AI 插件观察是否还会卡顿如果正常了再逐个开启其他插件直到找出冲突源。找到之后是二选一还是做配置错开取决于冲突的具体行为。我在一次实际排查中遇到过这样的问题某个 AI 插件在文件保存时会触发一次异步请求而另一个代码检查插件会在保存时做全文件扫描两个操作叠在一起把 CPU 吃满导致保存文件时卡住近一秒。解决办法是把代码检查插件的扫描模式改成保存时手动检查让两个任务错峰执行。内存层面上的对策同样重要。如果你想在多个 IDE 里同时启用 AI 插件千万不要让它们同时运行大型项目的全量索引。要么只保留当前正在使用的 IDE 做全量索引要么合理调整 IDE 的“项目缓存大小限制”。尤其在使用 JetBrains 和 VS Code 同时打开一个大项目时内存直接翻倍是有可能的这属于对机器规格有实际要求的场景。建议开发机的内存不低于 32GB如果你经常要多开 IDE这个规格不是享受而是基本盘。4.4 表格速查高频问题与对应解法现象优先排查项对应解法已登录但无建议提示状态栏图标是否绿色重新登录检查网络连接查看日志建议触发太慢上下文是否过大拆分任务减少无关文件索引建议总是偏掉注释和函数意图是否清晰补充说明性注释打开相关定义文件按 Tab 弹不出建议快捷键冲突重设快捷键检查其它插件绑定保存文件时卡顿异步任务冲突错开 AI 请求与检查插件的触发时机找不到某 IDE 的插件插件市场搜索关键词错误查看插件官网使用精确文档路径关掉 AI 后系统仍异常残留进程未退出彻底退出 IDE检查任务管理器/进程列表这个表格里的内容是我在使用过程中实际碰到过的典型场景。核心心态就是AI 插件本质上是一个远程服务 本地代理 编辑器扩展三层架构任何一层出问题都会以各种奇怪的形式反馈到编辑界面上。排查时不要去猜而是用“分层排查”的方式先确认每一层是否健康定位速度会快很多。5. 最后再分享几个实操心得折腾了大半年我最大的体会是把“AI 副驾驶”装上所有 IDE 不是终点而是重新思考和重构自己编码习惯的起点。以前我写注释是为了让别人看懂现在我写注释更多是为了让 AI 给出更好的建议这种变化看似微小但实际提升了整体代码的清晰度算是意外的收获。可以说AI 并不是取代程序员而是在倒逼程序员更精准地表达意图。还有一个很实用的小技巧给不同类型的工作流设置不同的 AI 使用策略。比如写算法题时我完全不依赖 AI 补全必须自己一步一步推理否则很快就失去手感写业务代码时我优先用 AI 生成骨架然后手动填充核心逻辑写测试代码时我让 AI 尽可能多地生成断言和边界条件我再一个个校验过去。同样的工具在不同的场景下使用策略完全不同这才是“效率革命”真正的落点。如果你刚开始折腾建议不要一次把所有 IDE 都装好而是先在主力 IDE 里用两周把快捷键和验收习惯建立起来再逐步扩展到其他环境。一次性全部铺开的试错成本太高而且很容易打击信心。先用一个 IDE把验证习惯打磨到形成肌肉记忆再在其它 IDE 里复制同样逻辑这时的效率提升是最平滑的。一个值得投入时间的点是定期回顾 AI 建议记录。很多 AI 插件会在本地记录你的建议接受率和补全行为每个月花一点时间看看自己接受建议的模式你会发现哪些场景里 AI 帮了大忙哪些场景里你在浪费时间。这样的项目复盘比单纯堆更多工具要有意义得多。最终工具会一直演进但真正让开发效率产生质变的是你自己围绕 AI 重新设计的这套工作流。